HDRP Custom Pass Shader 获取世界坐标和近/远裁剪平面坐标

11 篇文章 0 订阅
4 篇文章 0 订阅

获取世界坐标

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;
    }

外部传参方式获取远裁剪平面坐标

假如不容易获取深度信息,可以在外部将摄像机的近/远裁剪平面传入Shader。

        skyboxMaterial.SetVectorArray("_Cornel", new List<Vector4>
        {
            cam.ViewportToWorldPoint(new Vector3(0, 0, cam.farClipPlane)),
            cam.ViewportToWorldPoint(new Vector3(1, 0, cam.farClipPlane)),
            cam.ViewportToWorldPoint(new Vector3(0, 1, cam.farClipPlane)),
            cam.ViewportToWorldPoint(new Vector3(1, 1, cam.farClipPlane)),
        });

在 Shader 借助预存的UV或其他信息取得对应数据

        float4 _Cornel[4];

        v2f vert (appdata v)
        {
            // 省略
            o.worldPos = _Cornel[v.uv.x + v.uv.y * 2].xyz;
			// 省略
        }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、本插件适合ENVI 5.X版本。 2、将sav.dat和smmap.sav文件拷贝到以下路径: c:\用户\用户名\.idl\envi\custom_code5_X\ 重新启动ENVI,即可以Extensions目录下找到“Standard Map Fram”模块,双点即可启动。 如果找不到目录可以参考以下步骤: 启动ENVI软件,File-Preferences-Directorieso-Custom Code Directory,所对应的目录即为扩展插件安装目录。 3、模块有可以三个功能块: 1)根据标准幅编号生成经纬度和2000坐标框,软件自动选取2000坐标系的中心经度和带号。如需其他坐标框,可用经纬度框投影转换。生成梯形框只需要只输入左下角框编号,然后输入梯形框的行列数即可。矢量中每个框均为一个单独的矢量,通过删除某几个框,可以快速生成不规则框组合。该模块需要注册使用,非注册用户只可以生成样例框。 2)根据经纬度计算不同比例尺的幅编号,该功能免费。输入经纬度,即可查到不同比例尺下的幅编号。注意输入经纬度时,纬度在上面,经度在下面。 3)可以生成经纬度和2000坐标系自定义框和自定义梯形框。输入左下角经度和纬度,输入经度和纬度间距,即可生成自定义框。输入梯形框的行列数,即可生成自定义梯形框。该模块需要注册使用。 4、将软件提示的硬件ID字符串发至邮箱:[email protected]获取硬件key码,输入软件,即可完成注册。一台电脑对应一个Key码,如更换电脑需另行注册,申请注册时请选择对应电脑的硬件字符串。一次注册,永久使用,如系统重装,只需要再次输入key码即可完成注册。软件有ENVI 4.8插件版,有需要的可以在邮件内说明。不同版本插件在同一台电脑上可共用一个Key码,不需要再次注册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值