当前位置:网站首页>HDRP Custom Pass Shader 获取世界坐标和近裁剪平面坐标
HDRP Custom Pass Shader 获取世界坐标和近裁剪平面坐标
2022-08-11 09:08:00 【凌晨出没的东熊】
获取世界坐标
posInput的坐标需要再加上相机的坐标,蜜汁小小坑…
float3 ws = _WorldSpaceCameraPos + posInput.positionWS;
获取近裁剪平面坐标
用到函数 ComputeWorldSpacePosition()。
float3 nearPositionWS = ComputeWorldSpacePosition(posInput.positionNDC, 1, UNITY_MATRIX_I_VP);
nearPositionWS += _WorldSpaceCameraPos;
这个函数的内部实现当然还是用NDC坐标推世界空间坐标,但此处参数传入的是屏幕坐标UV。(虽然他命名成NDC- -,但实际上是屏幕坐标UV,左下角(0, 0) , 右上角(1, 1))
另外,此处近平面深度是1,远平面是0。
这篇链接详细推导了如何使用NDC坐标和深度推导世界空间坐标。上善若水_2019-根据深度信息重建屏幕像素在世界中的坐标-简书
在顶点着色器中实现
注释掉引用 CustomPassCommon.hlsl 的那一行,把 CustomPassCommon.hlsl 里面的内容复制到你的着色器中,解锁顶点着色器。
把顶点着色器中的代码更改成这样子
struct Varyings
{
float4 positionCS : SV_POSITION;
// 增加一个寄存器
float3 positionWS : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
Varyings Vert(Attributes input)
{
Varyings output;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
// 注释掉
// output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID, UNITY_RAW_FAR_CLIP_VALUE);
// 改成
float2 uv = float2((input.vertexID << 1) & 2, input.vertexID & 2);
output.positionCS = float4(uv * 2.0 - 1.0, UNITY_RAW_FAR_CLIP_VALUE, 1.0);
float3 nearPositionWS = ComputeWorldSpacePosition(uv, 1, UNITY_MATRIX_I_VP);
nearPositionWS += _WorldSpaceCameraPos;
output.positionWS = nearPositionWS;
return output;
}
边栏推荐
猜你喜欢
随机推荐
Quickly submit a PR (Web) for OpenHarmony in 5 minutes
观察表情和面部,会发现他有焦虑和失眠的痕迹
海信自助机-HV530刷机教程
Oacle数据库使用问题
对比学习系列(三)-----SimCLR
2022-08-09 顾宇佳 学习笔记
pycharm cancel msyql expression highlighting
1.3版本自定义TrainOneStepCell报错
基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示
UNITY gameobject代码中setacvtive(false)与面板中直接去掉勾 效果不一样
IPQ4019/IPQ4029 support WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975
canvas图像阴影处理
jenkins 流水线脚本详细解析Pipeline
关于ts中的指针问题call,bind, apply
opencv 制作趣图
flex布局回顾
新一代开源免费的轻量级 SSH 终端,非常炫酷好用!
dsu on tree(树上启发式合并)学习笔记
Alibaba Sentinel - Slot chain解析
Getting Started with Kotlin Algorithms Calculating Prime Factors