zoukankan      html  css  js  c++  java
  • Unity之fragment shader中如何获得视口空间中的坐标

    2种方法:

    1. 使用 VPOS 或 WPOS语义,如:

    Shader "Test/ScreenPos1"
    {
        SubShader
        {
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                
                struct appdata
                {
                    float4 pos : POSITION;
                };
    
                struct v2f
                {
                    float4 pos : SV_POSITION;
                };
    
                v2f vert (appdata v)
                {
                    v2f o;
                    o.pos = mul(UNITY_MATRIX_MVP, v.pos);
                    return o;
                }
                
                fixed4 frag (v2f i : WPOS) : SV_Target
                {
                    fixed2 viewPos = i.pos.xy / _ScreenParams.xy;
                    return fixed4(viewPos, 0, 1);
                }
                ENDCG
            }
        }
    }
    View Code

    其中,VPOS/WPOS 的z分量范围为[0,1],在摄像机的*裁剪*面处,z值为0,在远裁剪*面处,z值为1。 

    2. 使用 UnityCG.cginc 中的 ComputeScreenPos 方法,如:

    Shader "Test/ScreenPos2"
    {
        SubShader
        {
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "UnityCG.cginc"
    
                struct appdata
                {
                    float4 pos : POSITION;
                    float4 scrPos : TEXCOORD0;
                };
    
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float4 scrPos : TEXCOORD0;
                };
    
                v2f vert (appdata v)
                {
                    v2f o;
                    o.pos = mul(UNITY_MATRIX_MVP, v.pos);
                    o.scrPos = ComputeScreenPos(o.pos);
                    return o;
                }
                
                fixed4 frag (v2f i) : SV_Target
                {
                    fixed2 viewPos = i.scrPos.xy / i.scrPos.w;
                    return fixed4(viewPos, 0, 1);
                }
                ENDCG
            }
        }
    }
    View Code

    详细参考《Unity shader入门精要》 91页。

    转载请注明出处:http://www.cnblogs.com/jietian331/p/7025853.html

    渲染结果如下:

  • 相关阅读:
    bzoj1218 本来dp 但是数据弱 枚举可过
    bzoj1816二分答案 扑克牌
    bzoj2748 水dp
    最长上升子序列(nlog n)
    bzoj1798线段树。。调的要死
    HTML5 移动开发 (HTML5标签和属性)
    关于全屏布局
    关于z-index这个层级的问题
    面板数据模型
    竞争模型
  • 原文地址:https://www.cnblogs.com/jietian331/p/7025853.html
Copyright © 2011-2022 走看看