etqw-sdk/base/renderprogs/megatexture/specular.rprog

217 lines
5.5 KiB
Plaintext

renderProgram megaTexture/snow_specular {
state {
blend GL_ONE, GL_ONE
}
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP bitangent;
TEMP R0, R1, R2;
# derive bitangent
XPD bitangent, $normalAttrib, $tangentAttrib;
MUL bitangent, bitangent, $tangentAttrib.w;
#
# Texture coord 0: Specular and normal map coordinates
#
DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t;
MOV result.texcoord[4].x, $texCoordAttrib;
MOV result.texcoord[4].y, $texCoordAttrib;
#
# Texture coord 1: Megatexture detail mask lookup
#
MOV result.texcoord[1], $texCoordAttrib;
#
# Texture coord 2: Tangent sun dir
#
DP3 result.texcoord[2].x, $tangentAttrib, $sunDirection;
DP3 result.texcoord[2].y, bitangent, $sunDirection;
DP3 result.texcoord[2].z, $normalAttrib, $sunDirection;
#
# Texture coord 3: Tangent view dir
#
SUB R1, $viewOrigin, $positionAttrib;
DP3 result.texcoord[3].x, $tangentAttrib, R1;
DP3 result.texcoord[3].y, bitangent, R1;
DP3 result.texcoord[3].z, $normalAttrib, R1;
#
# Color: Diffuse normal dot product (so specular doesn't appear on backsides) and sun color
#
DP3 R1, $normalAttrib, $sunDirection;
MUL result.color, $sunColor, R1;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R0, R1, localNormal, specular;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
PARAM flat = { 0, 0, 1, 0 };
# Half angle (per vertex gives really bad errors on landscape)
DP3 R0.w, fragment.texcoord[2], fragment.texcoord[2];
RSQ R0.w, R0.w;
MUL R0, R0.w, fragment.texcoord[2];
DP3 R1.w, fragment.texcoord[3], fragment.texcoord[3];
RSQ R1.w, R1.w;
MUL R1, R1.w, fragment.texcoord[3];
ADD specular, R0, R1;
DP3 specular.w, specular, specular;
RSQ specular.w, specular.w;
MUL specular, specular.w, specular;
# lookup normal map
TEX localNormal, fragment.texcoord[0], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R1.x, localNormal,localNormal;
ADD R1.x, 1, -R1.x;
RSQ R1.x, R1.x;
RCP localNormal.z, R1.x;
$endif
# perform the specular bump mapping
DP3 R1, specular, localNormal;
MAX R1, R1, 0;
POW_SAT R1, R1.x, $parameters.z;
DP3 R0, specular, flat;
MAX R0, R0, 0;
POW_SAT R0, R0.x, $parameters.x;
MUL R1, R1, $parameters.w;
MAD R1, R0, $parameters.y, R1;
# apply detail texture mask blue channel
TEX R0, fragment.texcoord[1], $megaDetailTextureMask, 2D;
MUL R1, R1, R0.z;
TEMP shadowMask;
TEX shadowMask, fragment.texcoord[4], $mask, 2D;
MUL R1, R1, shadowMask.z;
# multiply with sunlight contribution
MUL result.color, R1, fragment.color;
%> }
}
renderProgram megaTexture/specular {
interaction
ambientVersion ambient/basic
state {
depthFunc equal
maskDepth
blend GL_ONE, GL_ONE
}
program vertex reference interaction/basic
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP light, color, R1, R2, localNormal, specular;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
PARAM grayscale = { 0.3, 0.59, 0.11, 0.0 };
PARAM power = { 32.0, 0.0, 0.0, 0.0 };
# normalize with math
DP3 specular.x, fragment.texcoord[6], fragment.texcoord[6];
RSQ specular.x, specular.x;
MUL specular, specular.x, fragment.texcoord[6];
#
# the amount of light contacting the fragment is the
# product of the two light projections and the surface
# bump mapping
#
# perform the diffuse bump mapping
$if !r_shaderPreferALU
TEX light, fragment.texcoord[0], $normalCubeMap, CUBE;
MAD light, light, scaleTwo, subOne;
$else
# instead of using the normalization cube map, normalize with math
DP3 light.x, fragment.texcoord[0], fragment.texcoord[0];
RSQ light.x, light.x;
MUL light, light.x, fragment.texcoord[0];
$endif
TEX localNormal, fragment.texcoord[1], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
#Renormalize
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R1.x, localNormal,localNormal;
ADD R1.x, 1, -R1.x;
RSQ R1.x, R1.x;
RCP localNormal.z, R1.x;
$endif
DP3 light.x, light, localNormal;
# modulate by the light projection
TXP R1, fragment.texcoord[3], $lightProjectionMap, 2D;
MUL light, light.x, R1;
# modulate by the light falloff
TEX R1.x, fragment.texcoord[2], $lightFalloffMap, 2D;
MUL light, light, R1.x;
# Specular only
# perform the specular bump mapping
DP3 specular.x, specular, localNormal;
POW_SAT R1.x, specular.x, power.x;
# modulate by the constant specular factor
MUL R1, R1.x, $specularColor;
# modulate by the specular map * 2
TEX R2, fragment.texcoord[5], $specularMap, 2D;
ADD R2, R2, R2;
MUL color, R1, R2;
MUL color, light, color;
# apply detail texture mask blue channel
TEX R1, fragment.texcoord[4], $megaDetailTextureMask, 2D;
MUL color, color, R1.z;
# modify by the vertex color
MUL result.color.rgb, color, fragment.color;
# Bloom value
MUL R1, R1, R2;
MUL R1, R1, light;
DP3 result.color.a, R1, grayscale;
%> }
}