2015-09-21 23 views
3

看來我無法在我的電腦上使用gl_FragDepth。我的程序運行良好,否則,沒有glsl錯誤,glGetError返回0,但我無法從片段着色器中寫入深度緩衝區。gl_FragDepth破色

此外,在gl_FragDepth中寫入更改了像素顏色的紅色分量。

有我的程序的簡化版本。我修剪所有無用的東西(我GESS?),並且它沒有更好的工作:

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驅動程序將允許您使用更大的深度緩衝區,即使硬件不支持它(上次我看到這是在集成的SiS gfx卡上),請參閱[英特爾HD 3000上適當的OpenGL初始化是什麼?](http: //stackoverflow.com/q/19099162/2521214)我如何初始化像素格式... – Spektre