如何在某个z-pos处渲染纹理平面,使其朝向无限远可见?
我可以通过绘制真正巨大的平面来实现这一目标,但如果我将相机从地面移到更高的高度,那么我会开始看到平面边缘,我想避免被看到。
如果这是可能的,我宁愿使用非着色方法。
编辑:我按照建议使用了4d坐标系,但是:它的工作非常糟糕。即使在相机位置100,我的纹理也会变形,所以无论如何我都要绘制多个纹理四边形。也许我能做到这一点,并用4d坐标系绘制最远的四边形?任何更好的想法?
对于那些不知道opengl纹理失真的人来说,Edit2:,这是我用4d顶点坐标测试的例子:
(如果图片不可见:http://img828.imageshack.us/img828/469/texturedistort.jpg) 请注意,它只发生在相机足够远的情况下,在这种情况下,距离中间只有100.0个单位! (中间=(0,0)我的4个三角形开始向无穷远方向移动)。通常这发生在100000.0左右。但由于某种原因,它似乎早于4d顶点。
答案 0 :(得分:3)
您无法渲染无限大小的物体。
您很可能会将投影概念与无限大小的渲染对象混淆。 W为0的4D齐次坐标表示相对于投影在无穷远处的3D位置。但这并不意味着距离相机无限远;它意味着无限地关闭到相机。也就是说,它代表一个点Z坐标(在与透视投影矩阵相乘之前)等于摄像机位置(在摄像机空间中,这是0)。
参见透视投影下,与X轴和Y轴上的摄像机位于同一平面的点无限远。这是透视投影的本质。 4D齐次坐标允许您为它们提供所有有限数字,因此您可以对它们进行有用的数学运算(如剪裁)。
4D齐次坐标不允许您表示无限大的表面。
答案 1 :(得分:1)
绘制一个无限大的平面很简单 - 您只需要在屏幕坐标中计算水平线。要做到这一点,你必须简单地采取两个非共线的4D方向(比如,[1,0,0,0]和[0,0,1,0]),然后计算它们在屏幕上的位置(通过手动相乘)使用视图矩阵和投影矩阵,然后剪切到视口坐标。当你有这两个点时,你可以通过屏幕计算一条2D线并将其夹在它上面。在那里,你有你的无限平面(下面的多边形)但是,很难在这个平面上显示纹理,因为它会无限大。但是如果你的纹理很简单(例如网格),那么你可以用4D坐标自己计算它,使用上面相同的模式 - 计算点及其相应的消失点并连接它们。