【问题标题】:I can't understand the result of my fragment shader我无法理解片段着色器的结果
【发布时间】:2022-09-21 16:08:48
【问题描述】:

我是统一着色器编程的新手。我已经尝试了几行着色器代码。但我无法理解它的结果。

这是我的着色器代码。

Shader "Test/MyShader"{
Properties
{}

SubShader
{
    Tags { "RenderType"="Opaque" }
    LOD 100

    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        struct vertInput
        {
            float4 vertex : POSITION;
        };

        struct fragInput
        {
            float4 vertex : SV_POSITION;
        };

        fragInput vert (vertInput IN)
        {
            fragInput o;
            o.vertex = UnityObjectToClipPos(IN.vertex);
            return o;
        }

        fixed4 frag (fragInput IN) : SV_Target
        {
            return fixed4(IN.vertex);
        }
        ENDCG
    }
}

}

我将此着色器代码应用于普通平面。我希望结果看起来像光谱。 但是我得到的和我预期的很不一样。

Here's the image link.

And this is Plane's inspector info.

谁能解释为什么会出现这个结果?

【问题讨论】:

    标签: unity3d shader fragment-shader


    【解决方案1】:

    据我了解,您期​​望,该颜色将取决于屏幕上的像素位置。要做到这一点,您应该知道UnityObjectToClipPos(IN.vertex); 的结果是什么。 reslut 将是一个向量,其中包含

    • x = 屏幕上的像素 X 坐标,范围 [0,ScreenWidthInPixels]
    • y = 屏幕上的像素 Y 坐标,范围 [0,ScreenHeightInPixels]
    • z = 0
    • w = 到该像素中的对象的距离

    在您的示例中,您尝试以某种方式将其映射到颜色向量,即元素应在 [0, 1] 范围内。因此,此颜色将与您指定颜色 (1.0, 1.0, 0, 1.0) 相同。为了获得一些理智的结果,你应该让你的片段着色器看起来像这样或其他东西:

    fixed4 frag (fragInput IN) : SV_Target
            {
                //IN.vertex.w contains distance from camera to the object
                return fixed4(IN.vertex.x / _ScreenParams.x, IN.vertex.y / _ScreenParams.y, 0.0, 1.0);
            }
    

    结果将是:

    有用的链接:

    【讨论】:

    • 感谢您的友好回答!我会查找您粘贴的链接,然后再试一次。
    猜你喜欢
    • 2013-09-17
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多