使用“标准”的绘制对象的方法,使用透视投影glFrustum(-1, 1, -1, 1, 1, 100),近距离绘制对象存在明显的问题。当我将相机“飞”到距离小于 1 个单位的物体时,它会简单地消失,并且不会在相机后面 - 从数学上讲,它仍然在相机的视野中,但不会绘制它. glFrustum 函数具有 zNear 和 zFar 变量。如果用 zFar 一切都清楚了(实际上,这个参数负责绘制距离),那么 zNear 的作用就很奇怪了——当你指定一个低于 1 的值时,它不仅不会开始将对象绘制得更近,而且还会“拉伸”相机。这是一个示例程序
#include <gl/glew.h>
#include <GLFW/glfw3.h>
int main()
{
int posZ = -1;
glewInit();
glfwInit();
GLFWwindow* window = glfwCreateWindow(600, 600, "Untitled", 0, 0);
glfwMakeContextCurrent(window);
glFrustum(-1, 1, -1, 1, 1, 100);
glClearColor(1, 1, 1, 1);
glColor3f(1, 0, 0);
while (!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, posZ);
glVertex3f(1, 0, posZ);
glVertex3f(1, 1, posZ);
glEnd();
glfwSwapBuffers(window);
glfwPollEvents();
}
return 0;
}
一开始,我创建了一个 posZ 变量。如果小于 -1,则绘制所有内容(当然要考虑绘制距离)。例如,如果 posZ 为 -0.5f,则不绘制任何内容,尽管理论上三角形仍应在视图中
执行时,
glFrustum
坐标会在 from toz
范围内被截断,本例中为 from to 。因此,如果它是,例如,那么它不落入该范围并被截断。坐标的负值是因为轴指向相机。-near
-far
-1
-100
posZ
-0.5f
z
在减小zNear裁剪距离的同时,也应该减小X和Y裁剪,比如zNear = 0.1f,那么left、right、bottom、top的值也应该是0.1f。在代码中,它看起来像这样: