!!ARBfp1.0 # This is the fragment program for two # component dependent data with shading # We need some temporary variables TEMP index1, index2, normal, finalColor; TEMP temp1, temp2, temp3; TEMP sampleColor, sampleOpacity; TEMP ndotl, ndoth, ndotv; TEMP lightInfo, lightResult; # We are going to use the first # texture coordinate ATTRIB tex0 = fragment.texcoord[0]; # This is the lighting information PARAM lightDirection = program.local[0]; PARAM halfwayVector = program.local[1]; PARAM coefficient = program.local[2]; PARAM lightDiffColor = program.local[3]; PARAM lightSpecColor = program.local[4]; PARAM viewVector = program.local[5]; PARAM constants = program.local[6]; # This is our output color OUTPUT out = result.color; # Look up the scalar values / gradient # magnitude in the first volume TEX temp1, tex0, texture[0], 3D; # Look up the gradient direction # in the third volume TEX temp2, tex0, texture[2], 3D; # This normal is stored 0 to 1, change to -1 to 1 # by multiplying by 2.0 then adding -1.0. MAD normal, temp2, constants.x, constants.y; # Swizzle this to use (a,r) as texture # coordinates for color, and (g,b) for # opacity SWZ index1, temp1, a, r, 1, 1; SWZ index2, temp1, g, b, 1, 1; # Use this coordinate to look up a # final color in the second texture # (this is a 2D texture) and the final # opacity in the fourth texture. TEX sampleColor, index1, texture[1], 2D; TEX sampleOpacity, index2, texture[3], 2D; # Take the dot product of the light # direction and the normal DP3 ndotl, normal, lightDirection; # Take the dot product of the halfway # vector and the normal DP3 ndoth, normal, halfwayVector; DP3 ndotv, normal, viewVector; # flip if necessary for two sided lighting MUL temp3, ndotl, constants.y; CMP ndotl, ndotv, ndotl, temp3; MUL temp3, ndoth, constants.y; CMP ndoth, ndotv, ndoth, temp3; # put the pieces together for a LIT operation MOV lightInfo.x, ndotl.x; MOV lightInfo.y, ndoth.x; MOV lightInfo.w, coefficient.w; # compute the lighting LIT lightResult, lightInfo; # This is the ambient contribution MUL finalColor, coefficient.x, sampleColor; # This is the diffuse contribution MUL temp3, lightDiffColor, sampleColor; MUL temp3, temp3, lightResult.y; ADD finalColor, finalColor, temp3; # This is th specular contribution MUL temp3, lightSpecColor, lightResult.z; # Add specular into result so far, and replace # with the original alpha. ADD out, finalColor, temp3; MOV out.w, sampleOpacity.w; END