// initialize glew in the begging of application
glewInit();
// compile and link shader program from string
GLhandleARB InstallShaders ( const char *_vsSource, const char *_fsSource )
{
GLuint program;
GLuint vs, fs;
GLint vertCompiled;
GLint fragCompiled;
GLint linked;
vs = glCreateShader ( GL_VERTEX_SHADER );
if ( vs )
{
glShaderSource ( vs, 1, &_vsSource, NULL );
glCompileShader ( vs );
glGetShaderiv ( vs, GL_COMPILE_STATUS, &vertCompiled );
if ( !vertCompiled )
{
GLint infologLength = 0;
glGetShaderiv ( vs, GL_INFO_LOG_LENGTH, &infologLength );
if ( infologLength > 0 )
{
char *infoLog = (char*)malloc ( infologLength );
glGetShaderInfoLog ( vs, infologLength, NULL, infoLog );
int dsize = MultiByteToWideChar ( CP_ACP, 0, (char*)infoLog, -1, NULL, NULL );
WCHAR *des = new WCHAR[dsize];
MultiByteToWideChar ( CP_ACP, 0, (char*)infoLog, dsize, des, dsize );
MessageBox ( g_hMain, des, L"Vertex Shader Compile Error", MB_ICONERROR );
delete[] des;
free ( infoLog );
}
glDeleteShader ( vs );
vs = 0;
return 0;
}
}
fs = glCreateShader ( GL_FRAGMENT_SHADER );
if ( fs )
{
glShaderSource ( fs, 1, &_fsSource, NULL );
glCompileShader ( fs );
glGetShaderiv ( fs, GL_COMPILE_STATUS, &fragCompiled );
if ( !fragCompiled )
{
int infologLength = 0;
glGetShaderiv ( fs, GL_INFO_LOG_LENGTH, &infologLength );
if ( infologLength > 0 )
{
char *infoLog = (char*)malloc ( infologLength );
glGetShaderInfoLog ( fs, infologLength, NULL, infoLog );
int dsize = MultiByteToWideChar ( CP_ACP, 0, (char*)infoLog, -1, NULL, NULL );
WCHAR *des = new WCHAR[dsize];
MultiByteToWideChar ( CP_ACP, 0, (char*)infoLog, dsize, des, dsize );
MessageBox ( g_hMain, des, L"Fragment Shader Compile Error", MB_ICONERROR );
delete[] des;
free ( infoLog );
}
glDeleteShader ( fs );
fs = 0;
return 0;
}
}
if ( vs > 0 && fs > 0 )
{
program = glCreateProgram();
if ( program )
{
glAttachShader ( program, vs );
glAttachShader ( program, fs );
glDeleteShader ( vs );
glDeleteShader ( fs );
glLinkProgram ( program );
glGetProgramiv ( program, GL_LINK_STATUS, &linked );
if ( !linked )
{
int infologLength = 0;
glGetProgramiv ( program, GL_INFO_LOG_LENGTH, &infologLength);
if ( infologLength > 0 )
{
char *infoLog = (char*)malloc ( infologLength );
glGetProgramInfoLog ( program, infologLength, NULL, infoLog );
int dsize = MultiByteToWideChar ( CP_ACP, 0, (char*)infoLog, -1, NULL, NULL );
WCHAR *des = new WCHAR[dsize];
MultiByteToWideChar ( CP_ACP, 0, (char*)infoLog, dsize, des, dsize );
MessageBox ( g_hMain, des, L"Shader Link Error", MB_ICONERROR );
delete[] des;
free ( infoLog );
}
glDeleteProgram ( program );
program = 0;
return 0;
}
return program;
}
return 0;
}
return 0;
}
// clean up shader
GLint CleanUpShaders ( GLuint *_program )
{
glDeleteProgram ( *_program );
_program = 0;
return 1;
}
January 17, 2012
Creating OpenGL shaders
include : glut.h, glew.h
library : glut32.lib, glew32.lib
bin : glut32.dll, glew32.dll
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment