高效实现Z缓冲区

时间:2011-01-22 23:59:39

标签: c++ rendering graphics zbuffer

我目前正在使用Z-Buffer算法实现自己的渲染器。一旦我完成了必要的计算(读取:我的Z-Buffer填充了正确的值),我使用SDL在必要的像素中着色。我正在使用HWSurface。

我的问题是,如何尽可能快地渲染?有了这个,我的意思是绘图本身,我可以在我的结构,我的算法中进行优化,稍后我会这样做,但我想确保绘图本身尽可能快。

因为我有自己的ZBuffer实现(以后会有其他算法)我不能使用OpenGL,所以还有其他选择吗?

现在我只是浏览z-buffer中的所有点,然后逐个绘制所有必须绘制的像素(因为它是z-buffering,我必须这样做,对吧?)我称之为DrawPixel方法。关于SDL我在越过z缓冲区之前锁定我的表面,绘制所有像素并在之后解锁它,据我所知,这不会更快。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

软件实现速度非常慢 - 也就是说,WARP在i7 hexacore上呈现Crysis,其速度是8800GT的FPS的十分之一。在软件实现的Z缓冲区中,您将找不到任何竞争性的性能。

Z缓冲区不是一个特别复杂的算法,你不太可能找到一个比另一个更有效的实现。在光栅化过程中你不会做Z-buffering-这是你在像素渲染过程中所做的事情。如果新像素的深度远远超过当前写入的值,则不要再进一步渲染像素,例如,不要计算它的颜色等。您不会绘制z缓冲区或类似的东西。它不像你可以为你的算法选择最有效的排序 - 它更像是一个矩阵乘法,它们几乎都是一样的。