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
相关产品推荐
相关产品推荐

