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

