2015-09-21 1 views
3

Кажется, что я не могу использовать gl_FragDepth на своем компьютере. Моя программа работает хорошо, иначе glsl error, glGetError возвращает 0, но я не могу писать в буфере глубины из моего шейдера фрагмента.gl_FragDepth разрывает цвет

Кроме того, запись в gl_FragDepth изменяет красный компонент цвета пикселя.

Упрощенная версия моей программы. Я обрезают все бесполезные вещи (я Гесс?), И он не работает намного лучше:

int  main(void) 
{ 
// These are custom structures for handling shader programs. 
    t_glprog    prog; 
    t_glprog    prog2; 

    GLuint     vbo; 
    GLFWwindow    *window; 
    static const GLfloat vertab[] = 
    { 
     -1.0, -1.0, 1.0, 
     1.0, -1.0, 1.0, 
     1.0, 1.0, 1.0, 
     -1.0, 1.0, 1.0 
    }; 

    char const *vert = 
     "attribute vec3 Coord;" 
     "void main() {\ 
     gl_Position = vec4(Coord, 1.0);\ 
     }"; 

    char const *frag1 = 
     "void main() {\ 
     gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\ 
     gl_FragDepth = sin(gl_FragCoord.x * 0.1);\ 
     }"; 

    char const *frag2 = 
     "void main() {\ 
     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\ 
     gl_FragDepth = cos(gl_FragCoord.x * 0.1);\ 
     }"; 

    if (!glfwInit()) 
    { 
     fprintf(stderr, "GLFW failed to init.\n"); 
     return (-1); 
    } 

    glfwWindowHint(GLFW_DEPTH_BITS, 64); 
    window = glfwCreateWindow(640, 480, "TEST", NULL, NULL); 
    if (window == NULL) 
    { 
     fprintf(stderr, "Failed to open GLFW window.\n"); 
     glfwTerminate(); 
     return (-1); 
    } 
    glfwMakeContextCurrent(window); 

// For Windows. 
    if (glewInit() != GLEW_OK) 
    { 
     fprintf(stderr, "Failed to initialize GLEW\n"); 
     return (-1); 
    } 

    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 
    glClearDepth(1.0); 
    glViewport(0, 0, 640, 480); 

    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertab), vertab, GL_STATIC_DRAW); 

    create_shaders_prog(&prog, vert, frag1); 
    create_shaders_prog(&prog2, vert, frag2); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glUseProgram(prog.prog); 
    glDrawArrays(GL_QUADS, 0, 4); 

    glUseProgram(prog2.prog); 
    glDrawArrays(GL_QUADS, 0, 4); 

    glFlush(); 
    glfwSwapBuffers(window); 

    while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && 
      glfwWindowShouldClose(window) == 0) 
    { 
     glfwPollEvents(); 
    } 
    return (0); 
} 

Он должен рисовать красные и зеленые полосы, но вместо этого я получаю размытые красные линии. И если я удалю второй drawcall, это то же самое. В Windows, то есть. Я тестировал его на OSX и работал, как ожидалось.

Вот некоторые данные из glGetString:

GL_VENDOR : Intel 
    GL_RENDERER : Mobile Intel(R) 4 Series Express Chipset Family 
    GL_VERSION : 2.1.0 - Build 8.15.10.1892 
    GL_SHADING_LANGUAGE_VERSION : 1.20 - Intel Build 8.15.10.1892 
+0

Возможно ли использовать OpenGL версии 3.2 или более поздней версии в приложении вместо OpenGL 2.1? –

+0

Вам не нужно рисовать внутри цикла событий? –

+0

Мой ПК не поддерживает OpenGL 3.2, и я думал, что gl_FragDepth доступен с glsl 1.1. И ну, мне не нужно зацикливаться, анимации нет. – Procrade

ответ

1

Возможно ли, что ваш интегрированный драйвер видеокарты задыхается от этой линии?

glfwWindowHint(GLFW_DEPTH_BITS, 64); 

64 бит - это ужасная партия для буфера глубины. 24 бит - более типичное значение. Создание контекста должно завершиться неудачно, если 64-битный буфер глубины не поддерживается, но я видел странное поведение некоторых драйверов OpenGL, если буфер глубины настроен неправильно.

+0

Поскольку я читал документы GLFW, это намек, а не жесткое ограничение. Он должен просто получить как можно больше бит глубины. – JWWalker

+1

Да, правда. Тем не менее, предполагается, что драйвер возвращает ошибку в GLFW, если вы попытаетесь использовать настройку буфера плохой глубины. К сожалению, драйверы (особенно Windows OpenGL-драйверы для интегрированных видеокарт) не всегда очень хороши в использовании спецификации. Во всяком случае, подумал, что это может стоить выстрела, поэтому я отправил ответ :) –

+0

@JWWalker Я согласен с поддержкой большинства карт Мэтта только до 24 бит/буфера глубины лучше, чем до 32 (но обычно только в том случае, если другие буферы имеют меньшую ширину или разрешение по ширине или оба), я лучше видел это. Некоторые плохие драйверы gfx позволят вам использовать буфер большой глубины, даже если HW не поддерживает его (последний раз, когда я вижу это на интегрированной карте SiS gfx) см. [Что такое правильная инициализация OpenGL на Intel HD 3000?] (Http: //stackoverflow.com/q/19099162/2521214), как я инициализирую формат пикселей ... – Spektre

Смежные вопросы