2015-05-18 49 views
0

我正在倾斜OpenGL,此刻我学会了如何添加第三个维度。我想打一个立方体,但只有其一个侧面是不是透明的:OpenGL - 深度测试不起作用

Current front side is transparent

Blue side is not transparent

我绘制功能如下:

void draw() 
{ 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH); 

    glUseProgram(program); 

    // The attributes are like they have to be, nothing wrong here 
    glBindBuffer(GL_ARRAY_BUFFER, vboCube); 
    glEnableVertexAttribArray(attributePosition); 
    glVertexAttribPointer(
     attributePosition, 
     3, 
     GL_FLOAT, 
     GL_FALSE, 
     sizeof(attributes), 
     (GLvoid *)offsetof(attributes, position) 
    ); 
    glEnableVertexAttribArray(attributeColor); 
    glVertexAttribPointer(
     attributeColor, 
     3, 
     GL_FLOAT, 
     GL_FALSE, 
     sizeof(attributes), 
     (GLvoid *)offsetof(attributes, color) 
    ); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboCube); 
    int size; 
    glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); 

    glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
    glDisableVertexAttribArray(attributePosition); 
    glDisableVertexAttribArray(attributeColor); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

和我的蜱功能(它被称为每秒40次)看起来像这样:

void tick() 
{ 
    glm::mat4 model = glm::translate(glm::mat4(1), glm::vec3(0, 0, -4)); 
    glm::mat4 view = glm::lookAt(glm::vec3(0, -2, 0), glm::vec3(0, 0, -4), glm::vec3(0, 1, 0)); 
    glm::mat4 projection = glm::perspective(45.0f, WIDTH/(float) HEIGHT, 0.1f, 10.0f); 
    glm::mat4 daRealMvp = projection * view * model; // 9gaggers will get this 

    // adding some rotation so i can see why the cube looks strange 
    float angle = glfwGetTime(); 
    daRealMvp = daRealMvp * glm::rotate(glm::mat4(1), angle, glm::vec3(0, 1, 0)); 

    glUniformMatrix4fv(uniformMvp, 1, GL_FALSE, glm::value_ptr(daRealMvp)); 
} 

如果我删除glEnable(GL_DEPTH);(或将其移动到另一行)或将glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);更改为glClear(GL_COLOR_BUFFER_BIT);没有任何更改,所以我认为清除深度缓冲区时存在问题,但我不知道它是什么。

那么,我能做些什么来获得一个不错的立方体? :)

EDIT1:

有趣的是,蓝脸(这是不是透明)心不是在前面(所有顶点具有正Z)之一,其上是正确的(所有顶点有一个正X)。

回答

4

你应该在第三行中使用的

glEnable(GL_DEPTH_TEST); 

代替

glEnable(GL_DEPTH); 

+0

是的,谢谢。这是一件错误的事情。这就是我不喜欢的OpenGL ..我没有得到任何错误或者它只是默默无闻地工作^^ – danielspaniol

+0

只是想知道,为什么总是绘制蓝色的脸,即使另一个人的顶点与积极Z' – danielspaniol

+0

我不能告诉:),但对于错误,您可以随时使用宏检查glGetError,或者更好地设置调试环境,祝您好运 – Mehdi