【问题标题】:How to draw shapes in the proper order when rendering?渲染时如何以正确的顺序绘制形状?
【发布时间】:2015-11-06 19:54:33
【问题描述】:

我正在尝试编写一个 3d 图形引擎,但在以正确的顺序绘制形状时遇到了一些问题。

当我将三角形的点转换为窗口空间,即与屏幕上的位置直接相关的二维空间时,除了每个点的 x 和 y 位置外,我还为它们分配了一个深度变量,用于存储该点在 3d 空间中距离观察者多远。

目前,我渲染的唯一形状是三角形。我当前的渲染顺序算法按三角形 3 点的平均深度对三角形进行排序。我一开始就知道它并不完美,但我想要一个占位符进行测试。

出于测试目的,我构建了一个顶部开口的方形盒子,每边颜色不同,由 2 个三角形组成,如下所示:

从上图可以看出,我使用的算法大部分时间都有效。但是,在某些角度和位置,三角形会以错误的顺序呈现,如下所示:

如您所见,框底部的青色三角形之一在侧面的黄色三角形之一之前绘制。显然,按点的平均深度对三角形进行排序并不令人满意。

有没有更好的排序形状的方法,以便它们以正确的顺序呈现?

【问题讨论】:

    标签: graphics 3d rendering


    【解决方案1】:

    以正确的深度顺序绘制 3D 的标准方法是使用Z-buffer

    基本上,这个想法是,对于您在颜色缓冲区中设置的每个像素,您还可以在 z(深度..)缓冲区中设置它的插值深度。每当您要绘制下一个像素时,首先检查 z 缓冲区以验证新像素是否位于已绘制像素的前面。

    除此之外,您还可以添加各种优化,例如对三角形进行排序,以尽量减少实际绘制颜色缓冲区的次数。

    另一方面,有时需要执行完全相反的操作才能正确处理透明度或其他“高级”效果。

    【讨论】:

    • 所以基本上,为每个像素保留一个最近 z 的映射,当你绘制一个像素时,你检查以确保它的 z 不离最近的 z 更远?
    • 是的,这就是它的精髓。不要忘记将自助餐初始化为每帧的“最远 z”。
    • 你能推荐一种绘制每个像素的有效方法吗?目前,我在 SFML 之上构建它,它已经支持 2d 渲染。我正在使用 sfml 来绘制填充形状,而不是单个像素。当我绘制单个像素时,我离盒子越近,帧率就会大大下降。逐像素绘制形状的最佳方法是什么?
    • 我对SFML不熟悉,但如果你追求效率,这种事情必须通过硬件加速来完成,你根本不会处理像素。事实上,硬件会为您处理 z-buffering(您只需正确配置即可)。如果您的目的是“手动”做事,我不推荐任何库,但您可能应该编写自己的 setPixel 函数。
    猜你喜欢
    • 2021-10-13
    • 2014-01-06
    • 2016-09-27
    • 1970-01-01
    • 2019-07-12
    • 2016-09-26
    • 2023-03-04
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多