立方体面被隐藏表面覆盖
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链接
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++指针在 for 循环中被覆盖
- 如何在C++中为表面制作邻接矩阵
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么我的全局 new() 覆盖被绕过了?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- C++找出覆盖同一行的数组
- 专门化模板覆盖函数/避免对象切片
- 重写打印函数而不是覆盖基类
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 如何在 c++ 中覆盖相同的文本文件
- 覆盖应用程序的低级别键盘挂钩问题
- 立方体面被隐藏表面覆盖