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

如何用Shader实现砖墙的色彩随机变化与真实感提升?

砖块Shader自然色彩随机化实现方案

核心思路

用基于砖块网格坐标的伪随机值,给每个砖块添加统一的色彩偏移,既保证单块砖颜色一致,又让整体砖块群有自然的色彩差异,完全符合你要的非单一色彩效果。

修改后的完整Shader代码

Shader "Custom/BrickShader"
{
    Properties
    {
        _BaseColor ("基础颜色", Color) = (0.568, 0.25, 0.21, 1)
        _BrickSize ("砖块尺寸", float) = 0.1
        _BrickSpacing ("砖块间距", float) = 0.02
        _ColorVariation ("颜色随机强度", Range(0, 0.3)) = 0.15 // 控制颜色变化幅度,0为无变化
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 sv_Position : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            float _BrickSize;
            float _BrickSpacing;
            fixed4 _BaseColor;
            float _ColorVariation;

            // 伪随机函数:输入2D坐标,输出0-1范围的随机值
            float random(float2 st)
            {
                return frac(sin(dot(st, float2(12.9898, 78.233))) * 43758.5453123);
            }

            v2f vert (appdata v)
            {
                v2f o;
                o.sv_Position = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // 计算每个砖块的唯一网格坐标(X/Y索引)
                float brickX = floor(i.uv.x / (_BrickSize + _BrickSpacing));
                float brickY = floor(i.uv.y / (_BrickSize + _BrickSpacing));

                // 给当前砖块生成固定随机值
                float randVal = random(float2(brickX, brickY));
                // 把随机值转为正负偏移,范围由_ColorVariation控制
                float colorOffset = (randVal - 0.5) * 2 * _ColorVariation;

                // 生成带随机偏移的砖块颜色,限制值在0-1之间避免溢出
                fixed4 brickColor = _BaseColor + colorOffset;
                brickColor = clamp(brickColor, 0, 1);

                // 可选:砖块边缘暗化,增强立体感(取消注释即可启用)
                float brickOffsetX = frac(i.uv.x / (_BrickSize + _BrickSpacing)) * _BrickSize;
                float brickOffsetY = frac(i.uv.y / (_BrickSize + _BrickSpacing)) * _BrickSize;
                if (brickOffsetX < _BrickSize * 0.2 || brickOffsetY < _BrickSize * 0.2)
                {
                    brickColor *= 0.8;
                }

                return brickColor;
            }
            ENDHLSL
        }
    }
    FallBack "Diffuse"
}

关键代码解释

  • 随机函数:通过正弦函数与坐标点积生成伪随机值,输入是砖块的网格索引,所以每个砖块会得到一个固定的随机数,不会出现单块砖上颜色混乱的问题。
  • _ColorVariation参数:新增的可调节滑块,直接控制色彩变化的幅度,0代表无变化,0.1-0.3是比较自然的区间。
  • 颜色偏移处理:把0-1的随机值转为正负对称的偏移量,加到基础颜色上,再用clamp确保颜色值在合法的0-1范围内,避免出现异常颜色。
  • 可选边缘暗化:取消注释后,砖块边缘会稍微变暗,让砖块的轮廓更清晰,更接近你参考的目标效果。

进阶优化建议

  • 如果想要更细腻的色彩过渡,可以用Perlin噪声替代简单随机函数,或者导入一张噪声纹理,基于纹理采样值调整颜色,这样颜色变化会有自然的渐变关联。
  • 可以给RGB通道分别设置不同的随机强度,比如让红色通道偏移更大,绿色通道偏移更小,模拟真实红砖的色彩差异。
  • 新增粗糙度/金属度的随机参数,让砖块的反光效果也有差异,进一步提升整体质感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:35:54