Shader::Shader(std::string vertex, std::string pixel ) { const char *pixelSource; const char *vertexSource; std::string pString, vString; size_t pixelSourceLen, vertexSourceLen; vert_shader = glCreateShader(GL_VERTEX_SHADER); frag_shader = glCreateShader(GL_FRAGMENT_SHADER); // загрузка исходников вертексного шейдера vString = readFile(vertex); vertexSource = vString.c_str(); vertexSourceLen = vString.size(); glShaderSource(vert_shader, 1, &vertexSource, (const GLint*)&vertexSourceLen); // загрузка исходников фрагментарного шейдера pString = readFile(pixel); pixelSource = pString.c_str(); pixelSourceLen = pString.size(); glShaderSource(frag_shader, 1, &pixelSource, (const GLint*)&pixelSourceLen); // компил¤ци¤ шейдеров glCompileShader(vert_shader); glCompileShader(vert_shader); // создание шейдерной программы shader_program = glCreateProgram(); // присоединение шейдеров к программе glAttachShader(shader_program, vert_shader); glAttachShader(shader_program, frag_shader); // сборка шейдерной программы glLinkProgram(shader_program); // вывод информации о ходе компил¤ции и сборки PrintProgramLog(shader_program); // если были обнаружены ошибки - выходим if (glGetError() == GL_NO_ERROR) { log_debug("Shader::Shader: Shaders loaded"); } else { shader_program = 0; log_warning("Shader::Shader: Shaders NOT loaded"); } }
// // Create Shader Program // int CreateShaderProg(const char* VertFile,const char* FragFile) { // Create program int prog = glCreateProgram(); // Create and compile vertex shader if (VertFile) CreateShader(prog,GL_VERTEX_SHADER,VertFile); // Create and compile fragment shader if (FragFile) CreateShader(prog,GL_FRAGMENT_SHADER,FragFile); // Link program glLinkProgram(prog); // Check for errors PrintProgramLog(prog); // Return name return prog; }
// // Create Shader Program // int CreateShaderProg(const char* VertFile,const char* FragFile, char ** arrayAttributes) { // Create program int prog = glCreateProgram(); // Create and compile vertex shader if (VertFile) CreateShader(prog,GL_VERTEX_SHADER,VertFile); // Create and compile fragment shader if (FragFile) CreateShader(prog,GL_FRAGMENT_SHADER,FragFile); if(arrayAttributes){ int k; for ( k=0;arrayAttributes[k];k++) if (arrayAttributes[k][0]) glBindAttribLocation(prog,k,arrayAttributes[k]); } // Link program glLinkProgram(prog); // Check for errors PrintProgramLog(prog); // Return name return prog; }
int GLSL::LinkProgram(int vshader, int fshader, int gshader) { int programID = 0; // create shader program if (vshader && fshader) programID = glCreateProgram(); if (programID > 0) { // attach shaders to program glAttachShader(programID, vshader); glAttachShader(programID, fshader); if (gshader >= 0) glAttachShader(programID, gshader); // link and verify glLinkProgram(programID); GLint status; glGetProgramiv(programID, GL_LINK_STATUS, &status); if (status == GL_FALSE) PrintProgramLog(programID); } return programID; }
// // Create Shader Program including Geometry Shader // int CreateShaderProgGeom() { // Create program int prog = glCreateProgram(); // Compile and add shaders CreateShader(prog,GL_VERTEX_SHADER ,"nbody.vert"); #ifdef __APPLE__ // OpenGL 3.1 for OSX CreateShader(prog,GL_GEOMETRY_SHADER_EXT,"nbody.geom_ext"); glProgramParameteriEXT(prog,GL_GEOMETRY_INPUT_TYPE_EXT ,GL_POINTS); glProgramParameteriEXT(prog,GL_GEOMETRY_OUTPUT_TYPE_EXT ,GL_TRIANGLE_STRIP); glProgramParameteriEXT(prog,GL_GEOMETRY_VERTICES_OUT_EXT,4); #else // OpenGL 3.2 adds layout () CreateShader(prog,GL_GEOMETRY_SHADER,"nbody.geom"); #endif CreateShader(prog,GL_FRAGMENT_SHADER,"nbody.frag"); // Link program glLinkProgram(prog); // Check for errors PrintProgramLog(prog); // Return name return prog; }
bool CShaderInstance::Initialize( CBaseShader* pShader ) { assert( pShader ); assert( m_Program == 0 ); m_pShader = pShader; const char* const pszName = pShader->GetName(); std::unique_ptr<char[]> vertex( LoadShaderFile( pszName, SHADER_VERTEX_EXT ) ); std::unique_ptr<char[]> frag( LoadShaderFile( pszName, SHADER_FRAG_EXT ) ); if( !vertex || !frag ) return false; GLuint vertexShader; GLuint fragShader; if( !CreateShader( pszName, vertex.get(), GL_VERTEX_SHADER, vertexShader ) ) return false; if( !CreateShader( pszName, frag.get(), GL_FRAGMENT_SHADER, fragShader ) ) { glDeleteShader( vertexShader ); check_gl_error(); return false; } m_Program = glCreateProgram(); check_gl_error(); glAttachShader( m_Program, vertexShader ); check_gl_error(); glAttachShader( m_Program, fragShader ); check_gl_error(); OnPreLink(); //Link program glLinkProgram( m_Program ); check_gl_error(); //Mark shaders as deleted so they'll be freed when the program is deleted. glDeleteShader( fragShader ); check_gl_error(); glDeleteShader( vertexShader ); check_gl_error(); //Check for errors GLint programSuccess = GL_TRUE; glGetProgramiv( m_Program, GL_LINK_STATUS, &programSuccess ); check_gl_error(); if( programSuccess != GL_TRUE ) { printf( "Error linking shader program \"%s\" (%d)!\n", pszName, m_Program ); PrintProgramLog( m_Program ); glDeleteProgram( m_Program ); check_gl_error(); m_Program = 0; return false; } if( !OnPostLink() ) { printf( "Error post-linking shader program \"%s\" (%d)!\n", pszName, m_Program ); glDeleteProgram( m_Program ); check_gl_error(); m_Program = 0; return false; } return true; }