c++ - 如何渲染一个看似无限大的平面?

标签 c++ opengl

我如何渲染某个 z-pos 的纹理平面以使其朝向无穷远可见?

我可以通过绘制非常大的飞机来实现这一点,但如果我将相机从地面移到更高的高度,那么我会开始看到飞机的边缘,我想避免被看到。

如果这甚至可能,我更喜欢非着色器方法。

编辑:我尝试按照建议使用 4d 坐标系,但是:效果非常糟糕。即使在相机位置 100,我的纹理也会变形,所以无论如何我都必须绘制多个带纹理的四边形。也许我可以这样做,并用 4d 坐标系绘制最远的四边形?有更好的想法吗?

Edit2: 对于那些不知道什么是 opengl 纹理失真的人,这里是我使用 4d 顶点坐标进行的测试的示例: enter image description here

(如果图片不可见:http://img828.imageshack.us/img828/469/texturedistort.jpg) 请注意,只有当相机距离足够远时才会发生这种情况,在这种情况下它离中间只有 100.0 个单位! (中间 = (0,0) 我的 4 个三角形开始走向无穷大)。通常这发生在 100000.0 左右。但是对于 4d 顶点,由于某种原因它似乎发生得更早。

最佳答案

您无法渲染无限大小的对象。

您很可能将投影的概念与无限大小的渲染对象混淆了。 W 为 0 的 4D 齐次坐标表示相对于投影处于无穷远的 3D 位置。但这并不意味着一个点离相机无限远;它意味着无限靠近相机的点。也就是说,它表示 Z 坐标(在与透视投影矩阵相乘之前)等于相机位置(在相机空间中为 0)的点。

在透视投影下看,与相机在同一平面上的点在X轴和Y轴上无限远。这就是透视投影的本质。 4D 齐次坐标允许您为它们提供所有有限的数字,因此您可以对它们进行有用的数学计算(如剪裁)。

4D 齐次坐标不允许您表示无限大的表面。

关于c++ - 如何渲染一个看似无限大的平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7380250/

相关文章:

C++ 代码断行,看在我的份上,我无法修复它

c++ - 调用函数时没有调用构造函数

c++ - 如何在MFC中同时创建两个事件对话框?

c++ - 将 std::wstring 转换为 const wchar_t x[]

c++ - 运行 QT Creator 时 OpenGL 的问题

objective-c - 我的 NSOpenGLView 无法工作。我什么都试过了

c++ - 在 OpenGL 中渲染纹理 1 到 1

c++ - 对可变参数模板多继承函数调用的访问不明确

java - 在GLJpanel中绘制图像的正确方法

c - OpenGL 如何用鼠标选取方 block 并拖动它?