virtual void setObjName(const dglnet::ContextObjectName& name) { setText(0, QString("Shader ") + QString::number(name.m_Name) + QString::fromStdString( " (" + GetShaderStageName(name.m_Target) + ")")); QClickableTreeWidgetItem::setObjName(name); }
/// This function compiles a shader and check the log bool GLSLShader::CompileShader(GLint target, const std::string& fileName, const std::string& header) { std::string source = LoadTextFile(fileName); std::string shaderStage = GetShaderStageName(target); source = CombineHeaders(header, shaderStage + std::string("Shader"), source); GLhandleARB shader = glCreateShaderObjectARB(target); const char* src = source.c_str(); glShaderSourceARB(shader, 1, &src, NULL); glCompileShaderARB(shader); GLint compiled = 0, length = 0, laux = 0; glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); if (!compiled) std::cerr << "ERROR: Compilation of "<<shaderStage<<" shader failed:"<<std::endl; // else std::cout << "Compilation of "<<shaderStage<<" shader OK" << std::endl; glGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); if (length > 1) { std::cerr << "File: " << fileName << std::endl; if (!header.empty()) std::cerr << "Header:\n" << header << std::endl; GLcharARB *logString = (GLcharARB *)malloc((length+1) * sizeof(GLcharARB)); glGetInfoLogARB(shader, length, &laux, logString); std::cerr << logString << std::endl; free(logString); } if (compiled) m_hShaders[target] = shader; else glDeleteObjectARB(shader); return (compiled!=0); }
GLuint TerrainTessellation::createShaderPipelineProgram(GLuint target, const char* src) { GLuint object; GLint status; object = glCreateShaderProgramv( target, 1, (const GLchar **)&src ); glGetProgramiv(object, GL_LINK_STATUS, &status); if (!status) { GLint charsWritten, infoLogLength; glGetProgramiv(object, GL_INFO_LOG_LENGTH, &infoLogLength); char * infoLog = new char[infoLogLength]; glGetProgramInfoLog(object, infoLogLength, &charsWritten, infoLog); LOGI("Error compiling %s:\n", GetShaderStageName(target)); LOGI("Log: %s", infoLog); delete [] infoLog; glDeleteProgram( object); object = 0; } return object; }
/// This function loads a vertex and fragment shader file void GLSLShader::InitShaders() { // Make sure the user passed in at least a vertex and fragment shader file if(!GetVertexShaderFileName().length() || !GetFragmentShaderFileName().length()) { std::cerr << "GLSLShader requires setting a VertexShader and a FragmentShader" << std::endl; return; } // If any of our shader pointers are set, let's free them first. if(!m_hShaders.empty() || m_hProgramObject) Release(); bool ready = true; // Now we load and compile the shaders from their respective files for (std::map<GLint,std::string>::const_iterator it = m_hFileNames.begin(), itend = m_hFileNames.end(); it != itend; ++it) { ready &= CompileShader( it->first, it->second, header ); } if (!ready) { std::cerr << "SHADER compilation failed.\n"; return; } // Next we create a program object to represent our shaders m_hProgramObject = glCreateProgramObjectARB(); // We attach each shader we just loaded to our program object for (std::map<GLint,GLhandleARB>::const_iterator it = m_hShaders.begin(), itend = m_hShaders.end(); it != itend; ++it) { glAttachObjectARB(m_hProgramObject, it->second); } #if defined(GL_EXT_geometry_shader4) && defined(SOFA_HAVE_GLEW) if (GetGeometryShaderID()) { if (geometry_input_type != -1) glProgramParameteriEXT(m_hProgramObject, GL_GEOMETRY_INPUT_TYPE_EXT, geometry_input_type ); if (geometry_output_type != -1) glProgramParameteriEXT(m_hProgramObject, GL_GEOMETRY_OUTPUT_TYPE_EXT, geometry_output_type ); if (geometry_vertices_out != -1) glProgramParameteriEXT(m_hProgramObject, GL_GEOMETRY_VERTICES_OUT_EXT, geometry_vertices_out ); } #endif // Our last init function is to link our program object with OpenGL glLinkProgramARB(m_hProgramObject); GLint linked = 0, length = 0, laux = 0; glGetObjectParameterivARB(m_hProgramObject, GL_OBJECT_LINK_STATUS_ARB, &linked); if (!linked) std::cerr << "ERROR: Link of program shader failed:\n"<<std::endl; // else std::cout << "Link of program shader OK" << std::endl; glGetObjectParameterivARB(m_hProgramObject, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); if (length > 1) { GLcharARB *logString = (GLcharARB *)malloc((length+1) * sizeof(GLcharARB)); glGetInfoLogARB(m_hProgramObject, length, &laux, logString); std::cerr << logString << std::endl; free(logString); for (std::map<GLint,std::string>::const_iterator it = m_hFileNames.begin(), itend = m_hFileNames.end(); it != itend; ++it) std::cerr << GetShaderStageName(it->first) << " shader file: " << it->second << std::endl; } // Now, let's turn off the shader initially. glUseProgramObjectARB(0); }