Beispiel #1
0
 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);
 }
Beispiel #2
0
///	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;
}
Beispiel #4
0
///	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);
}