celestia/shaders/texphong_nv.fp

59 lines
1.5 KiB
GLSL

!!FP1.0
# Diffuse * texture + specular
# Specular term is modulated by a gloss map
#
# Textures:
# TEX0 - base texture
# TEX1 - gloss map
#
# Interpolants:
# f[TEX0] - base texture coordinates
# f[TEX1] - gloss map coordinates
# f[TEX2] - surface normal in object space
# f[TEX3] - half angle vector in object space
#
# Constants:
# p[0] - object space light vector
# p[2] - diffuse color
# p[3] - specular color
# p[4].x - specular exponent
# p[5] - ambient color
MOV R0, f[TEX2]; # surface normal in R0
MOV R1, f[TEX3]; # half angle vector in R1
# Normalize the surface normal (consider using a normalization cube map)
DP3 R0.w, R0, R0;
RSQ R0.w, R0.w;
MUL R0.xyz, R0, R0.w;
# Normalize the half-angle vector
DP3 R1.w, R1, R1;
RSQ R1.w, R1.w;
MUL R1.xyz, R1, R1.w;
# Compute the diffuse term
DP3 R2.x, R0, p[0];
# Compute the specular dot product
DP3 R2.y, R0, R1;
# Specular exponent in w
MOV R2.w, p[4].x;
LIT R3, R2;
TEX H0, f[TEX0], TEX0, 2D; # Sample the base texture
TEX H1, f[TEX1], TEX1, 2D; # Sample the gloss map
MULX H2, R3.y, p[2]; # Diffuse color * diffuse factor
ADDX_SAT H2, H2, p[5]; # Add ambient light to get 'scene color'
MULX H0, H2, H0; # Base texture * scene color
MULX R3.z, R3.z, H1; # Multiply the specular factor by the gloss map value
MULX R3.z, R3.z, R3.y; # Multiply the specular factor by the diffuse factor
MADX H0, R3.z, p[3], H0; # Multiply the specular factor by
# the specular color and add it in
MOVX o[COLR], H0;
END