You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity片元着色器结果异常求助:为何输出与预期不符?

问题原因解析

你得到的异常画面,核心问题出在片段着色器的取值逻辑上:

  • 错误使用了裁剪空间坐标:片段着色器里的IN.vertex是经过UnityObjectToClipPos转换后的裁剪空间坐标,这个坐标的范围不是颜色要求的[0,1]区间。在透视投影下,它的xyz分量通常在[-w, w]区间浮动,当你直接把它作为fixed4颜色返回时,所有大于1的数值会被截断成1,小于0的会被截断成0,最终画面就会出现大片的纯色块(比如你截图里的红、蓝区域),完全达不到光谱渐变的效果。

  • 没有传递渐变所需的位置参考:光谱效果需要基于平面上的相对位置(比如UV坐标)来计算颜色过渡,但你的顶点输入/输出结构体里都没有包含UV信息,片段着色器根本没有合适的变量来生成渐变效果。

修正后的示例代码

要实现光谱渐变,你需要添加UV坐标的传递,并基于UV计算颜色,比如这样修改:

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;
            float2 uv : TEXCOORD0; // 新增UV输入
        };

        struct fragInput
        {
            float4 vertex : SV_POSITION;
            float2 uv : TEXCOORD0; // 将UV传递到片段着色器
        };

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

        fixed4 frag (fragInput IN) : SV_Target
        {
            // 基于UV.x生成彩虹光谱,用HSV转RGB实现渐变
            fixed3 hsv = fixed3(IN.uv.x, 1.0, 0.5);
            fixed3 rgb = HSVToRGB(hsv);
            return fixed4(rgb, 1.0);
        }
        ENDCG
    }
}
}

这段代码会基于Plane的UV横向坐标生成从红到紫的光谱渐变,符合你最初的预期。

内容的提问来源于stack exchange,提问作者JAMONGJJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:15:41