Unity自定义Shader问题:如何实现两个完美正方形而非曲边效果
解决Unity Shader曲边问题,实现两个完美正方形
我来帮你搞定这个问题!当前Shader里的桶形畸变计算逻辑(就是t1和t2那部分代码)是导致曲边效果的核心原因。要得到两个完美的正方形,我们需要简化UV映射逻辑,去掉非线性的畸变计算,换成线性的坐标转换。
修改后的完整Pass代码
Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : POSITION; float2 uv : TEXCOORD0; }; // 默认顶点着色器无需修改 v2f vert(appdata_img v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord.xy); return o; } // 参数 sampler2D _MainTex; // _FOV参数已不再使用,可按需移除 float _FOV; // Alpha为像素密度比例:宽高比 float _Alpha; uniform float4x4 _UnityDisplayTransform; // 片元着色器:线性映射UV,实现两个完美正方形 fixed4 frag(v2f i) : COLOR { float2 uv_square; float offset; // 将屏幕左右半区分别线性映射到0-1的正方形UV范围 if (i.uv.x < 0.5) { // 左半屏:x轴从0~0.5拉伸到0~1 uv_square.x = i.uv.x * 2.0; } else { // 右半屏:x轴从0.5~1平移+拉伸到0~1 uv_square.x = (i.uv.x - 0.5) * 2.0; } // y轴保持原比例,后续通过_Alpha调整适配正方形 uv_square.y = i.uv.y; // 判断是否在正方形范围内,超出部分显示黑色 if (uv_square.x < 0.0 || uv_square.x > 1.0 || uv_square.y < 0.0 || uv_square.y > 1.0) { return fixed4(0, 0, 0, 1); } // 结合_Alpha(宽高比)调整纹理UV,确保显示完美正方形 offset = 0.5 - _Alpha * 0.5; float2 uv_tex = uv_square; uv_tex.x = uv_square.x * _Alpha + offset; return tex2D(_MainTex, uv_tex); } ENDCG }
关键改动说明
- 移除桶形畸变计算:删掉了
t1、t2和uv2相关的非线性映射,这是产生曲边的根源。 - 线性UV映射:把屏幕左右半区各自线性拉伸到0-1的UV范围,保证形状是标准正方形。
- 简化边界判断:直接检查映射后的UV是否在0-1范围内,超出部分统一显示黑色。
- 冗余参数优化:
_FOV参数已不再使用,你可以直接从代码中移除,减少冗余。
这样修改后,Shader就会在屏幕左右两侧分别渲染出完美的正方形,不会再有曲边效果啦!
内容的提问来源于stack exchange,提问作者user6038900
相关产品推荐
相关产品推荐

