0

我正在尝试让 OpenGL 应用程序在 c++ 中工作。OpenGL 似乎正在剔除远近对象。

在此处输入图像描述

屏幕截图应该是一堆方形图块,但距离相机太近或太远一定距离的方块不会被渲染。这意味着实际上只渲染了一条狭窄的正方形(在我认为是近平面和远平面之间)。

我没有使用平截头体剔除,我启用的唯一剔除是背面剔除。默认情况下,OpenGL 是否有某种截锥体剔除?是否需要启用 glEnable 才能让我的所有三角形实际渲染?启用 GL_DEPTH_TEST 绝对会停止渲染所有内容,无论我之后是否调用 glFrustum(...) 。

谢谢。

4

2 回答 2

0

固定的。不知道为什么,但它只是渲染其世界坐标(而不是相对于相机的坐标)在 1 和 -1 之间的三角形片段。通过使用 gluPerspective() 而不是 glMatrixMode(GL_PROJECTION) 后跟 glFrustum(...) 调用来修复。

至于为什么它没有被破坏,仍然没有更明智的选择,但至少它现在可以工作了:)

于 2019-07-14T16:05:24.677 回答
0

在您的代码中的某处,您应该初始化一个 projectionMatrix:

auto projectionMatrix = glm::mat4 perspective(fovy, aspect, zNear, zFar);

或者

auto projectionMatrix = gluPerspective(fovy, aspect, near, far); 

类似于上面的行。zNear 和 zFar 指定视锥体的下边界和最远边界。这些值会将您的片段位置映射到 [-1, +1]。

每个带有 a 的片段z == near都将映射到 -1。深度小于near的所有东西都将被丢弃。

尝试找到那些近处和远处的参数,并将它们的值更改为适合您场景的值。避免将 0 作为接近值,您也可以尝试移动相机以查看发生的一些变化。

于 2019-07-14T11:04:54.753 回答