typedef void (__stdcall *PFNGLGENPROGRAMSARB) ( int n, const unsigned int
*programs );
typedef void (__stdcall *PFNGLBINDPROGRAMARB) ( const int target, unsigned
int program );
typedef void (__stdcall *PFNGLPROGRAMSTRINGARB) ( const int target, const
int format, int len, const void *string );
PFNGLGENPROGRAMSARB glGenProgramsARB = NULL;
PFNGLBINDPROGRAMARB glBindProgramARB = NULL;
PFNGLPROGRAMSTRINGARB glProgramStringARB = NULL;
// membrane effect (as seen in nVidia effects browser)
const unsigned char myprogram[] = "!!ARBvp1.0 \n\
# variable declarations\n\
TEMP xfNorm, xfPos, r0;\n\
# transform vertex to clip cooridinates\n\
DP4 result.position.x, state.matrix.mvp.row[0], vertex.position;\n\
DP4 result.position.y, state.matrix.mvp.row[1], vertex.position;\n\
DP4 result.position.z, state.matrix.mvp.row[2], vertex.position;\n\
DP4 result.position.w, state.matrix.mvp.row[3], vertex.position;\n\
# produce point-to-eye vector\n\
DP4 xfPos.x, state.matrix.modelview.row[0], vertex.position;\n\
DP4 xfPos.y, state.matrix.modelview.row[1], vertex.position;\n\
DP4 xfPos.z, state.matrix.modelview.row[2], vertex.position;\n\
DP4 xfPos.w, state.matrix.modelview.row[3], vertex.position;\n\
# normalize point-to-eye vector\n\
DP3 r0.x, xfPos, xfPos;\n\
RSQ r0.x, r0.x;\n\
MUL xfPos, xfPos,-r0.x;\n\
# transform normal to eye coordinates\n\
DP3 xfNorm.x, state.matrix.modelview.invtrans.row[0], vertex.normal;\n\
DP3 xfNorm.y, state.matrix.modelview.invtrans.row[1], vertex.normal;\n\
DP3 xfNorm.z, state.matrix.modelview.invtrans.row[2], vertex.normal;\n\
# determine color\n\
DP3 r0.x, xfPos, xfNorm;\n\
ADD result.color, vertex.normal.w,-r0.x;\n\
MOV result.texcoord[0].x, r0.x;\n\
END";
// cloaked object effect
const unsigned char myprogram[] = "!!ARBvp1.0 \n\
# variable declarations\n\
TEMP xfNorm, xfPos, xfLit, Half, r0;\n\
# transform vertex to clip cooridinates\n\
DP4 result.position.x, state.matrix.mvp.row[0], vertex.position;\n\
DP4 result.position.y, state.matrix.mvp.row[1], vertex.position;\n\
DP4 result.position.z, state.matrix.mvp.row[2], vertex.position;\n\
DP4 result.position.w, state.matrix.mvp.row[3], vertex.position;\n\
# produce point-to-eye vector\n\
DP4 xfPos.x, state.matrix.modelview.row[0], vertex.position;\n\
DP4 xfPos.y, state.matrix.modelview.row[1], vertex.position;\n\
DP4 xfPos.z, state.matrix.modelview.row[2], vertex.position;\n\
DP4 xfPos.w, state.matrix.modelview.row[3], vertex.position;\n\
# normalize point-to-eye vector\n\
DP3 r0.x, xfPos, xfPos;\n\
RSQ r0.x, r0.x;\n\
MUL xfPos, xfPos,-r0.x;\n\
# transform normal to eye coordinates\n\
DP3 xfNorm.x, state.matrix.modelview.invtrans.row[0], vertex.normal;\n\
DP3 xfNorm.y, state.matrix.modelview.invtrans.row[1], vertex.normal;\n\
DP3 xfNorm.z, state.matrix.modelview.invtrans.row[2], vertex.normal;\n\
# produce light vector\n\
ADD xfLit, state.light[0].position,-xfPos;\n\
# normalize light vector\n\
DP3 r0.x, xfLit, xfLit;\n\
RSQ r0.x, r0.x;\n\
MUL xfLit, xfLit, r0.x;\n\
# compute half vector\n\
ADD Half, xfLit, xfPos;\n\
# normalize half vector\n\
DP3 r0.x, Half, Half;\n\
RSQ r0.x, r0.x;\n\
MUL Half, Half, r0.x;\n\
# determine color\n\
DP3 r0.y, xfNorm, Half;\n\
MOV r0.w, state.material.shininess;\n\
LIT r0, r0;\n\
DP3 r0.x, xfNorm, xfPos;\n\
MUL r0.z, r0.z, r0.z;\n\
ADD result.color, r0.z,-r0.x;\n\
END";
glGenProgramsARB = (PFNGLGENPROGRAMSARB)wglGetProcAddress(
"glGenProgramsARB" );
glBindProgramARB = (PFNGLBINDPROGRAMARB)wglGetProcAddress(
"glBindProgramARB" );
glProgramStringARB = (PFNGLPROGRAMSTRINGARB)wglGetProcAddress(
"glProgramStringARB" );
if (!glGenProgramsARB | | !glBindProgramARB | | !glProgramStringARB) {
MessageBox( NULL, "Unable to retrieve vertex program procedure
addresses.", "", MB_OK );
return false; }
glGenProgramsARB( 1, programs );
glBindProgramARB( GL_VERTEX_PROGRAM_ARB, programs[0] );
glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
strlen( (const char*)myprogram ), myprogram );
if (glGetError() == GL_INVALID_OPERATION) // tripped
MessageBox( NULL, "Invalid Operation", "", MB_OK );
// ... and last, but not least, our beloved glEnable() call.
glEnable( GL_VERTEX_PROGRAM_ARB );