所以我最近观看了Z战的视频,并且学会了一种简单的方式来照顾它 - 主要是。给出的解决方案是实际上歪斜投影,以便为更精确的深度测试提供更多空间(因为浮点只能如此精确),并且将更远的物体塞入投影的一小部分区域。现在,我对OpenGL和图形编程还很陌生(只是慢慢地开展工作),实际上我没有做出任何足够复杂的工作,但这对我来说是个问题,但我将来可能需要知道这一点。无论如何,上述解决方案带来的新问题更加严重的是在远距离的Z-战斗(例如,天际山,铁锈山等)。是否有更好的解决方案,即使它具有性价比,也不涉及图形折衷?假设地说(因为我对OpenGL管线还不是很舒服),程序中的Z值在进行深度测试之前是否可以加倍加倍?如何避免Z距离战斗?
让我澄清。想想天际。注意山脉有时会闪烁吗?当使用OpenGL渲染场景时,所有对象都会被挤压或“夹”到Z值为-1.0到1.0的小坐标平面中。然后对每个物体进行深度测试 - 树木,雪,山脉,动物,房屋,您可以对其进行命名,以便在被其他物体覆盖时不会绘制任何物体。然而,浮点只能达到一定的精度,因此将数百个物体夹在一个小空间中不可避免地会导致某些物体具有完全相同的Z坐标,并且这两个物体在屏幕上一起闪烁,称为“Z -战斗”。我在问每个对象的深度(z-)坐标是否可以转换为双精度,以便它们具有足够的精度(值得为可忽略的一段时间使用可忽略的额外内存),以便按正确的顺序精确绘制对象,而不会相互剪切。
不错的问题,但“铸造”到一个更大的类型不会自动增加细节。如果您将Pi的值存储在float中并稍后将其转换为double,则它不会自动获得更有意义的数字。 – usr2564301
不会,只有在z值被强制调整之前,它们才会使z值增加一倍 - 这样当它们夹在-1.0和1.0之间时,精度就会高得多,而且不会像重复的Z值那么容易。 –
您必须记住OpenGL的深度缓冲区需要为每个像素*存储深度值*。增加其保真度的唯一方法是将其深度设置为使用更多字节。 (并且请注意,一些OpenGL实现对此大小有限制。)您可能需要阅读https://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm。 – usr2564301