立方体面被隐藏表面覆盖

Cube faces get overwritten by hidden surfaces

本文关键字:表面 覆盖 隐藏 立方体 体面 立方      更新时间:2023-10-16

在OpenGL SuperBible中的第124页是一个旋转立方体的例子。

我实现的代码接近书中所说的,我的立方体的侧面是部分透明的。我不知道为什么我能透过立方体的某些部分看到东西。我自己编写了多维数据集数据,因此可能存在问题。

    我再次检查了我的立方体顶点。
  • 我尝试使用禁用筛选glDisable(GL_CULL_FACE);在我的渲染函数。
  • 我尝试设置alpha通道在我的着色器中设置一个固定的值。

我不知道为什么我的立方体可以部分透明。显示功能:

void Chapter5_Page124::render(double currentTime)
{
    GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };
    float f = (float)(currentTime * M_PI * 0.1);
    vmath::mat4 mv_matrix =
        vmath::translate(0.0f, 0.0f, -4.0f) *
        vmath::translate
        (
        sinf(2.1f * f) * 0.5f,
        cosf(1.7f * f) * 0.5f,
        sinf(1.3f * f) * 0.5f * cosf(1.5f * f) * 2.0f
        ) *
        vmath::rotate((float)currentTime * 45.0f, 0.0f, 1.0f, 0.0f) *
        vmath::rotate((float)currentTime * 81.0f, 1.0f, 0.0f, 0.0f);
    glDisable(GL_CULL_FACE);
    glClearBufferfv(GL_COLOR, 0, green);
    glUseProgram(*program);
    glUniformMatrix4fv(mv_location, 1, GL_FALSE, mv_matrix);
    glUniformMatrix4fv(proj_location, 1, GL_FALSE, proj_matrix);
    glDrawArrays(GL_TRIANGLES, 0, 36);
}

顶点着色器:

#version 430 core                                                 
in vec4 position;
out VS_OUT
{
    vec4 color;
}vs_out;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
void main(void)                                                   
{                                                                 
    gl_Position = proj_matrix * mv_matrix * position;
    vs_out.color = position * 2 + vec4(0.5, 0.5, 0.5, 0.0);
    vs_out.color.a = 1;
}                                                                 

不同旋转时立方体的屏幕截图:

[![1]][1]

我的立方体出了什么问题?我怎样才能修好它?


编辑4

从问题中删除不相关的信息。更改了问题,因为我现在更好地理解发生了什么

正如其中一条评论中提到的,错误是在渲染函数中。我花了一段时间才意识到这一点。

void Chapter5_Page124::render(double currentTime)
{
    GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };
    float f = (float)(currentTime * M_PI * 0.1);
    vmath::mat4 mv_matrix =
        vmath::translate(0.0f, 0.0f, -4.0f) *
        vmath::translate
        (
        sinf(2.1f * f) * 0.5f,
        cosf(1.7f * f) * 0.5f,
        sinf(1.3f * f) * 0.5f * cosf(1.5f * f) * 2.0f
        ) *
        vmath::rotate((float)currentTime * 45.0f, 0.0f, 1.0f, 0.0f) *
        vmath::rotate((float)currentTime * 81.0f, 1.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glClearBufferfv(GL_COLOR, 0, green);
    glUseProgram(*program);
    glUniformMatrix4fv(mv_location, 1, GL_FALSE, mv_matrix);
    glUniformMatrix4fv(proj_location, 1, GL_FALSE, proj_matrix);
    glDrawArrays(GL_TRIANGLES, 0, 36);
}

编辑:

这个答案并没有完全解决它,但是我发现了另一个资源,可以更好地了解为什么会发生这种情况以及如何修复它。Youtube链接