/** * Creates an executable shader. * * @param vs Vertex shader source code * @param fs Fragment shader source code * @param gs Geometry shader source code * @return Internal ID of compiled and linked shader generated by OpenGL */ GLhandleARB opengl_shader_create(const SCP_vector<SCP_string>& vs, const SCP_vector<SCP_string>& fs, const SCP_vector<SCP_string>& gs) { GLhandleARB vs_o = 0; GLhandleARB fs_o = 0; GLhandleARB gs_o = 0; GLhandleARB program = 0; if (!vs.empty()) { vs_o = opengl_shader_compile_object( vs, GL_VERTEX_SHADER_ARB ); if ( !vs_o ) { mprintf(("ERROR! Unable to create vertex shader!\n")); goto Done; } } if (!fs.empty()) { fs_o = opengl_shader_compile_object( fs, GL_FRAGMENT_SHADER_ARB ); if ( !fs_o ) { mprintf(("ERROR! Unable to create fragment shader!\n")); goto Done; } } if (!gs.empty()) { gs_o = opengl_shader_compile_object( gs, GL_GEOMETRY_SHADER_EXT ); if ( !gs_o ) { mprintf(("ERROR! Unable to create fragment shader!\n")); goto Done; } } program = opengl_shader_link_object(vs_o, fs_o, gs_o); if ( !program ) { mprintf(("ERROR! Unable to create shader program!\n")); } Done: if (vs_o) { vglDeleteObjectARB(vs_o); } if (fs_o) { vglDeleteObjectARB(fs_o); } if (gs_o) { vglDeleteObjectARB(gs_o); } return program; }
/** * Creates an executable shader. * * @param vs Vertex shader source code * @param fs Fragment shader source code * @return Internal ID of the compiled and linked shader as generated by OpenGL */ GLhandleARB opengl_shader_create(const char *vs, const char *fs) { GLhandleARB vs_o = 0; GLhandleARB fs_o = 0; GLhandleARB program = 0; if (vs) { vs_o = opengl_shader_compile_object( (const GLcharARB*)vs, GL_VERTEX_SHADER_ARB ); if ( !vs_o ) { mprintf(("ERROR! Unable to create vertex shader!\n")); goto Done; } } if (fs) { fs_o = opengl_shader_compile_object( (const GLcharARB*)fs, GL_FRAGMENT_SHADER_ARB ); if ( !fs_o ) { mprintf(("ERROR! Unable to create fragment shader!\n")); goto Done; } } program = opengl_shader_link_object(vs_o, fs_o); if ( !program ) { mprintf(("ERROR! Unable to create shader program!\n")); } Done: if (vs_o) { vglDeleteObjectARB(vs_o); } if (fs_o) { vglDeleteObjectARB(fs_o); } return program; }