首页 > 其他分享 >【Shader】ComputeScreenPos 的使用

【Shader】ComputeScreenPos 的使用

时间:2024-07-14 14:52:21浏览次数:14  
标签:tex2Dproj ComputeScreenPos 0.5 pos Shader 使用 float4

 

  1. 在顶点着色器中使用 ComputeScreenPos.
  2. 使用 tex2Dproj 搭配 screenPos 来按屏幕 uv 采样 屏幕材质(如 _CameraDepthTexture 和 _CameraNormalTexture).
  3. ComputeScreenPos:
    • 接受的输入 顶点在裁剪空间(经过 MVP matrix 的变换) 的位置
    • 将输出 从 

 

--- 转自 ComputeScreenPos解析-CSDN博客

今天学习Unity Shader做水特效时,看到两个函数ComputeScreenPos、tex2Dproj,相关代码如下:

……
i.proj = ComputeScreenPos(UnityObjectToClipPos(v.vertex));
……
half depth = LinearEyeDepth(tex2Dproj(_CameraDepthTexture, i.proj).r);
……

注意到ComputeScreenPos得到的结果用在了 tex2Dproj 函数中作为uv参数。看函数名ComputeScreenPos应该是计算屏幕坐标,得到的应该是具体的坐标值,不应该是uv值。遂查询该方法,定义如下:

inline float4 ComputeNonStereoScreenPos(float4 pos) {
    float4 o = pos * 0.5f;
  // =(0.5x, 0.5y, 0.5z, 0.5w) o.xy = float2(o.x, o.y*_ProjectionParams.x) + o.w;
  // =(0.5x + 0.5w, 0.5y * _Proj.x + 0.5w, 0.5z, 0.5w) o.zw = pos.zw;
  // =(0.5x + 0.5w, 0.5y * _Porj.x + 0.5w, z, w) return o; } inline float4 ComputeScreenPos(float4 pos) { float4 o = ComputeNonStereoScreenPos(pos); #if defined(UNITY_SINGLE_PASS_STEREO) o.xy = TransformStereoScreenSpaceTex(o.xy, pos.w); #endif return o; }

发现ComputeScreenPos的结果确实不是屏幕坐标,而是把裁剪空间坐标从 [-w,w] 转成 [0,w]。 tex2Dproj 在采样的时候会除以w分量。

我们需要在顶点着色器中使用ComputeScreenPos得到结果,在片元着色器中除以其次分量得到视口空间坐标,具体原因见《UnityShader入门精要》 4.93章节(92页)

标签:tex2Dproj,ComputeScreenPos,0.5,pos,Shader,使用,float4
From: https://www.cnblogs.com/bakabird/p/18301577

相关文章

  • 帝国CMS网站通过自定义扩展变量功能,用户可以自定义公共的程序使用变量,为用户扩展系统
    通过自定义扩展变量功能,用户可以自定义公共的程序使用变量,为用户扩展系统带来便利。比如可以增加像系统$public_r[newsurl]这样的变量,还比如扩展了某个系统模型,需要增加设置项都可以用扩展变量来实现...等等。 一、登录后台,单击“系统”菜单,选择“扩展变量”......
  • 提货卡管理系统软件在线使用说明
    提货卡管理系统软件在线使用说明一、提货卡介绍与功能概述提货卡概述:介绍提货卡的作用和用途,如用于商品提货、优惠兑换等。管理系统功能:概述提货卡管理系统的主要功能,包括提货卡发放、查询、兑换等功能。二、注册与登录注册流程:提供注册账号的步骤和方法,填写必......
  • 前端开发--中的 Git 基本使用
     什么是Git?Git是一个开源的分布式版本控制系统,用于跟踪源代码的更改。它允许多个开发者协同工作,管理项目的各个版本,并能够轻松地恢复到之前的版本。安装Git在开始使用Git之前,需要先安装它。可以从Git官网下载并安装适用于各个平台的Git客户端。安装完成后,可以通过......
  • 音视频开发—使用FFmpeg从纯H264码流中提取图片 C语言实现
    文章目录1.H264码流文件解码流程关键流程详细解码流程详细步骤解析2.JPEG编码流程详细编码流程详细步骤解析3.完整示例代码4.效果展示从纯H.264码流中提取图片的过程包括解码和JPEG编码两个主要步骤,以下是详细阐述1.H264码流文件解码流程关键流程查找编解码器......
  • 什么是Nacos???Nacos是干啥的???如何使用Nacos???
    目录1.引言:2.服务调用3.注册中心原理3.1.服务注册者(ServiceRegistrar)3.2.服务消费者(ServiceConsumer)3.3注册中心(ServiceRegistry)4.Nacos注册中心5.服务注册5.1.添加依赖5.2.配置Nacos5.3.启动服务实例6.服务发现6.1.引入依赖6.2配置Nacos地址6.3.发现并......
  • 数字电路仿真实验【使用Multisim软件仿真】
    基本逻辑门电路功能测试与门仿真7408TTL2输入端四与门与门逻辑功能测试仿真电路及逻辑转换仪面板图与非门仿真7400TTL2输入端四与非门与非门逻辑功能测试仿真电路及逻辑转换仪面板图编码器电路功能测试通过4532BP优先编码器(8-3线编码器)功能表测试其逻辑功......
  • Doping:使用精心设计的合成数据测试和评估异常检测器的技术
    在这篇文章中,我们将探讨测试和评估异常检测器的问题(这是一个众所周知的难题),并提出了一种解决方案被称为“Doping”方法。使用Doping方法,真实数据行会被(通常是)随机修改,修改的方式是确保它们在某些方面可能成为异常值,这时应该被异常检测器检测到。然后通过评估检测器检测Doping记录......
  • java InputStream read使用及读取数据注意
    publicabstractintread()throwsIOException;从输入流中读取下一个字节的数据。值字节以int的形式返回,范围在0-255之间。如果由于到达流的末尾而没有字节可用,则返回值-1。此方法会一直阻塞,直到输入数据可用、检测到流结束或抛出异常为止。 publicintread(byteb[],i......
  • 高通dump ftrace & kernelshark使用
    简介高通ramdump可以解析出ftrace,方便用于追踪快省稳问题。kernelshark是一个可以查看traceevent的图形化工具,方便梳理和观察内核微观行为。trace-cmd是设置读取ftrace的命令行工具,kernelshark既可以记录数据,也可以图形化分析结果。在/sys/kernel/debug/tracing/......
  • Xilinx Video IP(二)Video In to AXI4-Stream的使用
        通常情况下,使用IP的顺序就是:创建和设置IP、连接输入输出、对IP进行配置(可选)。 创建和设置IP    我们先看一下默认设置以及对应的IP接口。每时钟像素数量    这个很好理解,例如常规解码芯片(如HDMI转RGB)、解串芯片(SDI转BT1120)输出的并行数据......