[英]OpenGL far clipping when using frustum
我正在使用GLFW + OpenGL尝试制作“旋转立方体”。 尽管大多数都能正常工作,但我在远端进行了裁剪。 我尝试将视锥的值更改为非常大的数字,但这似乎没有效果。
int main(void) {
if (!glfwInit()) exit(EXIT_FAILURE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
GLFWwindow* window = glfwCreateWindow(640, 360, "3dTest", NULL, NULL);
if (!window) {
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); // Grey Background
float rotqube = 0;
while (!glfwWindowShouldClose(window)) {
// clear color and depth buffer for new frame
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// set up camera
glViewport(0, 0, 640, 360);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
// position camera
glTranslatef(0.0f, 0.0f, -2.0f); // Translate Into The Screen 2.0 Units
glRotatef(rotqube, 0.0f, 1.0f, 0.0f); // Rotate The cube around the Y axis
glRotatef(rotqube, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS); // Draw The Cube Using quads
glColor3f(0.0f, 1.0f, 0.0f); // Color Blue
glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
...
glColor3f(1.0f, 0.0f, 1.0f); // Color Violet
glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Right)
glVertex3f(1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)
glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Right)
glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Right)
glEnd(); // End Drawing The Cube
rotqube += 0.3f;
//Swap buffer and check for events
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate;
exit(EXIT_SUCCESS);
return 0;
}
看起来是这样的:
glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
^ wat
参数:
left
,right
:指定左右垂直剪切平面的坐标。
bottom
,top
:指定底部和顶部水平裁剪平面的坐标。
nearVal
,farVal
:指定到近景和远景裁剪平面的距离。
两个距离都必须为正。
尝试类似0.1
到100.0
:
glFrustum(-100.0, 100.0, -100.0, 100.0, 0.1, 100.0);
您根本没有使用透视投影。 您的来电
glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
除了设置GL_INVALID_VALUE
错误状态外, 没有任何作用 。
如OpenGL 2.0规范第2.11节“坐标转换”所述:
对于
void Frustum( double l, double r, double b, double t, double n, double f );
坐标
(l, b, −n)^T
和(r, t, −n)^T
指定分别在近裁剪平面上映射到窗口左下角和右上角的点(假设眼睛位于(0, 0, 0)^T
)。f
给出了从眼睛到远裁剪平面的距离。 如果n
或f
小于或等于零 ,l
等于r
,b
等于t
或n
等于f
, 则会产生错误INVALID_VALUE
。
尝试在近平面或远平面之一位于摄影机后面的位置设置投影没有丝毫意义,并且会在渲染过程中导致很多数学上的奇数(即,将位于摄影机平面上的顶点除以零),因此这个不允许。
由于此函数会因错误而失败,因此您将使用单位矩阵作为投影矩阵,并且最终以正交投影结束。
编写完所有这些内容之后,我必须使您知道所有这些内容已经完全过时了。 固定功能流水线和GL矩阵堆栈,包括类似功能glFrustum
, glLoadIdendity
, glRotate
使用,和立即模式渲染glBegin
/ glEnd
被弃用,大约十年前已经被去除的OpenGL形式芯轮廓。 尝试在2018年学习这些知识是一个非常糟糕的主意,我强烈建议您改为学习现代OpenGL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.