//////////////////////////////////////////////////////////////////////
// NV_Fragment_Program
void LoadFragmentProgramFromFile(char *ShaderFile, unsigned int &ShaderID)
{
//////////////////////////////////////////////////////////////
/// Load the fragment program from a text file
FILE *fp;
unsigned char *stringShader;
if((fp = fopen(ShaderFile,"rb")) == NULL)
{
CString Msg;
Msg.Format("Error to read in the Fragment Program file <%s>",ShaderFile);
AfxMessageBox(Msg);
return;
}
fseek(fp, 0, SEEK_END);
int stringLength = ftell(fp);
fseek(fp, 0, SEEK_SET);
stringShader = new unsigned char[stringLength + 1];
fread(stringShader, 1, stringLength, fp);
stringShader[stringLength] = '\0';
fclose(fp);
///////////////////////////////////////////////////////////////
glGenProgramsNV(1, &ShaderID);
glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, ShaderID);
glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, ShaderID, stringLength, stringShader);
///////////////////////////////////////////////////////////////
if(GL_INVALID_OPERATION == glGetError())
{
// Find the error position
GLint errPos;
glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errPos );
// Print implementation-dependent program
// errors and warnings string.
unsigned char *errString = (unsigned char*)glGetString(GL_PROGRAM_ERROR_STRING_ARB);
CString Msg;
Msg.Format("When Loading Fragment Program <%s>, Error at position: %d
Error Content:
%s
",ShaderFile, errPos, errString);
AfxMessageBox(Msg);
exit(0);
}
///////////////////////////////////////////////////////////////
delete[] stringShader;
stringShader = NULL;
return;
}
Here I use float pbuffer to compute the values which textures are also stored in float.
In my program, even I declare like the following, the computation error is still there.
MULR R0, R0, p[0];
Here I do Vector +/-/* Vector operation on GPU, when the element of vector is samll, the result is right. But if the element is big, then error occurs.
[This message has been edited by foollove (edited 02-02-2004).]