Add option for geometry shader in initial pass

This commit is contained in:
Jack Christensen 2024-08-17 19:09:48 -04:00
parent 2f4de89791
commit 294c2f3c85
2 changed files with 71 additions and 0 deletions

View File

@ -7,6 +7,7 @@ GLuint InitShader( const char* computeShaderFile);
GLuint InitShader( const char* vertexShaderFile, const char* fragmentShaderFile );
GLuint InitShader( const char* vertexShaderFile, const char* geometryShader, const char* fragmentShaderFile );
GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* teShader, const char* fShaderFile );
GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* teShader, const char* gShaderFile, const char* fShaderFile );
#endif

View File

@ -336,5 +336,75 @@ GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* te
/* use program object */
glUseProgram(program);
return program;
}
GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* teShader, const char* gShaderFile, const char* fShaderFile )
{
bool error = false;
struct Shader
{
const char* filename;
GLenum type;
std::string source;
} shaders[5] =
{
{ vShaderFile, GL_VERTEX_SHADER, "" },
{ tcShader, GL_TESS_CONTROL_SHADER, "" },
{ teShader, GL_TESS_EVALUATION_SHADER, "" },
{ gShaderFile, GL_GEOMETRY_SHADER, "" },
{ fShaderFile, GL_FRAGMENT_SHADER, "" }
};
GLuint program = glCreateProgram();
for ( int i = 0; i < 5; ++i )
{
Shader& s = shaders[i];
s.source = readShaderSource(s.filename);
if ( shaders[i].source.length() == 0 )
{
std::cerr << "Failed to read " << s.filename << std::endl;
error = true;
}
GLuint shader = glCreateShader( s.type );
const char *c_str = s.source.c_str();
glShaderSource( shader, 1, (const GLchar**) &c_str, NULL );
glCompileShader( shader );
GLint compiled;
glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
if ( !compiled )
{
std::cerr << s.filename << " failed to compile:" << std::endl;
printShaderCompileError(shader);
error = true;
}
glAttachShader( program, shader );
}
/* link and error check */
glLinkProgram(program);
GLint linked;
glGetProgramiv( program, GL_LINK_STATUS, &linked );
if ( !linked )
{
std::cerr << "Shader program failed to link" << std::endl;
printProgramLinkError(program);
error = true;
}
if(error == true)
{
return -1;
}
/* use program object */
glUseProgram(program);
return program;
}