Проблемы компиляции исходного кода шейдера в приложении osg - PullRequest
1 голос
/ 23 декабря 2011

У меня есть приложение OSG, для которого я хочу наложить текстуру на полноэкранный четырехугольник в finalDrawCallback, потому что мне нужно, чтобы все в моей сцене было визуализировано до того, как будет выполнено текстурирование. Вот почему я должен использовать вызовы openGL вместо вызовов osg для выполнения программы и шейдеров.

В частности, у меня, похоже, проблема с компиляцией как vert, так и фрагментов шейдеров. Когда я вызываю glGetShaderiv(shader, GL_COMPILE_STATUS, &param), мое значение параметра не изменяется или не определено. Что, согласно его документации , говорит о том, что произошла ошибка. Однако когда я вызываю 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 Ответ

1 голос
/ 30 декабря 2011

Кажется, проблема была в том, что у меня не было графического контекста при выполнении этих вызовов.Я полагаю, это объясняет причину, по которой не было ошибок, но шейдеры не скомпилировались.

...