立方体面被隐藏的表面覆盖
Cube faces get overwritten by hidden surfaces
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 Link
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 Link