GLSL多貼圖。
vertex shader的程式碼:
varying vec3 lightDir,normal;
void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
lightDir = normalize(vec3(gl_LightSource[0].position));
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
fragment shader的程式碼:
uniform sampler2D tex,l3d;
void main()
{
vec3 ct,cf,c;
vec4 texel;
float intensity,at,af,a;
intensity = max(dot(lightDir,normalize(normal)),0.0);
cf = intensity * gl_FrontMaterial.diffuse.rgb +
gl_FrontMaterial.ambient.rgb;
af = gl_FrontMaterial.diffuse.a;
texel = texture2D(tex,gl_TexCoord[0].st);
ct = texel.rgb;
at = texel.a;
c = cf * ct;
a = af * at;
float coef = smoothstep(1.0,0.2,intensity);
c += coef * vec3(texture2D(l3d,gl_TexCoord[0].st));
gl_FragColor = vec4(c, a);
}
執行結果:
此程式多加了一個貼圖,上頭有L3D三個字元,正對光源會消失,背對光源會顯現,由smoothstep函式來控制。
float smoothstep (float edge0, float edge1, float x)
Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and performs smooth Hermite interpolation between 0.0 and 1.0 when edge0 < x < edge1. Results are undefined if edge0 >= edge1.
參考:Tutorials » GLSL 1.2 Tutorial » Multi-Texture。




隨意留個言吧:)~