在osg应用程序中编译着色器源的问题

时间:2011-12-22 22:43:08

标签: opengl glsl shader openscenegraph

我有一个OSG应用程序,我想纹理映射finalDrawCallback中的全屏四边形,因为我需要在纹理完成之前渲染场景中的所有内容。这就是为什么我必须使用openGL调用而不是osg调用程序和着色器来执行。

具体来说,我似乎遇到了编译vert和frag着色器的问题。当我调用glGetShaderiv(shader, GL_COMPILE_STATUS, &param)时,我的参数值不会改变或未定义。根据其documentation说,产生了错误。但是,当我致电glGetError()进行检查时,openGL会报告GL_NO_ERROR

这是设置功能

    glActiveTexture(GL_TEXTURE0);
    glGenTextures(1, &screenTexture);
    glBindTexture(GL_TEXTURE_2D, screenTexture);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    const GLchar* vs_source = shaderLoadFile("vert.glsl");

    glShaderSource(vs, 1, &vs_source, NULL);
    glCompileShader(vs);
    checkShader(vs);

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    const GLchar* fs_source = shaderLoadFile("frag.glsl");

    glShaderSource(fs, 1, &fs_source, NULL);
    glCompileShader(fs);
    checkShader(fs);

    prog = glCreateProgram();
    glAttachShader(prog, vs);
    glAttachShader(prog, fs);

    glLinkProgram(prog);
    glUseProgram(prog); 

用于读取着色器源的辅助函数:

FILE *f = fopen(file, "rb");
if (f == NULL)
{
    std::cout<<"Error: Unable to locate shader files.\n";
    exit(-1);
    return NULL;
}

fseek(f, 0, SEEK_END);
long size = ftell(f);
fseek(f, 0, SEEK_SET);
char* ret = new char[size+1];
fread(ret, size, 1, f);
fclose(f);
ret[size] = '\0';
return ret;

着色器本身

    //vertex shader
void main() 
{
    glTexCoord[0] = gl_MultiTexCoord0;
}
     //frag shader
uniform sampler2D screenTex;
void main()
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
}

编辑:我刚想出来了。似乎问题是我在进行这些调用时没有图形上下文。

1 个答案:

答案 0 :(得分:1)

似乎问题是我在进行这些调用时没有图形上下文。我相信这解释了没有产生错误但是着色器编译失败的原因。