Shader:Ramp Texture 的应用

Reading time ~1 minute

Ramp Texture 是一种控制漫反射的方法。 一般Ramp Texture是一种类似下图的渐变图:

一般的漫反射光照模型

这是一个半兰伯特光照模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
half4 LightingWrapLambert (SurfaceOutput s, half3 lightDir, half atten) {
    // 计算光线与法线的夹角余弦,求漫反射颜色。夹角越小,值越大。
    half NdotL = dot (s.Normal, lightDir);

    // 将结果都转换到[0,1]范围,可以保证光线和平面夹角大于90度(即余弦值小于0)时也可以有颜色。
    half diff = NdotL * 0.5 + 0.5;

    half4 c;
    // atten是光照的衰减值
    c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);
    c.a = s.Alpha;
    return c;
}

加入Ramp Texture:

1
2
3
4
5
6
7
8
9
10
11
12
half4 LightingRamp (SurfaceOutput s, half3 lightDir, half atten) {
    …
    …
    // 根据一张ramp贴图,根据余弦值对其颜色采样
    half3 ramp = tex2D (_RampTex, float2(diff, diff)).rgb;
    
    half4 c;
    // atten是光照的衰减值
    c.rgb = s.Albedo * _LightColor0.rgb * ramp * atten;
    c.a = s.Alpha;
    return c;
}

注意 half3 ramp = tex2D (_RampTex, float2(diff, diff)).rgb;
我们使用了diff值对RampTex 进行采样。
因为现在使用的Ramp贴图可以视为1D的颜色索引值,所以float2(diff, diff)也可以是float2(diff, 0),仅对x方向采样。
我们知道diff表示了光线和法线的夹角,夹角越小,diff值越大,颜色越亮,光线越直射表面。
所以效果上看,就是光线直接照射的面,采样到越靠右的颜色。

使用一个spotlight照射方块,Ramp贴图如上,可以看到光直接照射的面,diff很大,采样最右边的颜色,侧面的diff很小,采样倒了左侧的颜色。

Scriptable Objects 及 游戏架构

Scriptable Objects 相关介绍,及基于其的游戏架构技术 Continue reading

AssetBundle 最佳实践

Published on January 29, 2019

AssetBundle 基础总结

Published on January 27, 2019