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

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
}

关键改动说明

  1. 移除桶形畸变计算:删掉了t1、t2和uv2相关的非线性映射,这是产生曲边的根源。
  2. 线性UV映射:把屏幕左右半区各自线性拉伸到0-1的UV范围,保证形状是标准正方形。
  3. 简化边界判断:直接检查映射后的UV是否在0-1范围内,超出部分统一显示黑色。
  4. 冗余参数优化:_FOV参数已不再使用,你可以直接从代码中移除,减少冗余。

这样修改后,Shader就会在屏幕左右两侧分别渲染出完美的正方形,不会再有曲边效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:38:01