通过使用深度缓冲来丢弃重叠像素来优化OpenGL 2D渲染?

时间:2012-08-19 12:09:47

标签: c++ windows opengl rendering

是否有可能以某种方式利用深度缓冲区,使其仅绘制那些尚未绘制像素的区域?

我正在渲染简单的1个彩色三角形:它们中的很多可能会重叠,这会显着降低渲染速度,因为它渲染的像素比屏幕上可见的更多。

这在3D渲染模式下很容易实现:只需启用深度测试并在不同的z位置设置三角形。但是这在2d模式下不起作用:我不能将每个三角形设置在比前一个更高的位置上,因为当深度缓冲区限制到达时,这会导致在某个高度之后渲染质量不佳。

如何使用着色器执行此操作?或者如果不需要着色器;没有着色器怎么做?

2 个答案:

答案 0 :(得分:0)

为每个三角形指定一个多边形偏移(通过glPolygonOffset),并启用深度测试。

答案 1 :(得分:0)

  

我不能将每个三角形设置在比前一个更高的位置上,因为当深度缓冲区限制到来时,这将导致在某个高度之后渲染质量不佳。

只有做错了才会发生这种情况。

24位深度缓冲区提供1600万种不同的深度值供您选择。这只是一个正确计算价值的问题。当然,确切的机制是特定于硬件的,但没有那么具体,以至于你无法获得至少400万个单独的层。

这是一个简单的数学问题。您正在构建一个函数,该函数从整数范围[0,N]映射到浮点范围[0,1],其中N是三角形的数量。说,400万只是给你空间。

因此,任何pariticular三角形的Z值都是k/N,其中k是该三角形的整数索引。您应该可以在着色器中轻松完成此操作。

最糟糕的是,你可以制作一个32位浮点深度缓冲区。