📄 fragmentprogram.cpp
字号:
// FragmentProgram.cpp: implementation of the FragmenProgram class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "shadow.h"
#include "FragmentProgram.h"
#include "extgl.h"
#include "CommonHW.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// NV_Fragment_Program
// General Purpose Computations on GPU
//////////////////////////////////////////////////////////////////////
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\nError Content:\n %s\n",ShaderFile, errPos, errString);
AfxMessageBox(Msg);
exit(0);
}
///////////////////////////////////////////////////////////////
delete[] stringShader;
stringShader = NULL;
return;
}
void LoadFragmentProgramFromString(const unsigned char *ShaderString, unsigned int &ShaderID)
{
int stringLength = strlen((const char*)ShaderString);
///////////////////////////////////////////////////////////////
glGenProgramsNV(1, &ShaderID);
glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, ShaderID);
glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, ShaderID, stringLength, ShaderString);
///////////////////////////////////////////////////////////////
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 String, Error at position: %d\nError Content:\n %s\n",errPos, errString);
AfxMessageBox(Msg);
exit(0);
}
///////////////////////////////////////////////////////////////
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -