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

C++ 通过使用深度缓冲区丢弃重叠像素来优化OpenGL 2D渲染?,c++,windows,opengl,rendering,C++,Windows,Opengl,Rendering,是否有可能利用深度缓冲区,使其仅在尚未绘制像素的区域进行绘制 我正在渲染简单的单色三角形:很多三角形可能重叠,这将显著降低渲染速度,因为它渲染的像素比屏幕上可见的像素多 这在3D渲染模式下很容易实现:只需启用深度测试并在不同的z位置设置三角形。但这在2d模式下不起作用:我无法将每个三角形设置在比上一个更高的位置,因为当深度缓冲区限制出现时,这将导致在特定高度后渲染质量差 如何使用着色器执行此操作?或者如果不需要着色器;如何在没有着色器的情况下执行此操作?通过glPolygonOffset为每个三

是否有可能利用深度缓冲区,使其仅在尚未绘制像素的区域进行绘制

我正在渲染简单的单色三角形:很多三角形可能重叠,这将显著降低渲染速度,因为它渲染的像素比屏幕上可见的像素多

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


如何使用着色器执行此操作?或者如果不需要着色器;如何在没有着色器的情况下执行此操作?

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

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

我不能将每个三角形设置在比上一个更高的位置,因为当深度缓冲区限制出现时,在一定高度后,这会导致渲染质量差

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

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

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

因此,任何等分三角形的Z值都是k/N,其中k是该三角形的整数索引。您应该能够轻松地在着色器中执行此操作

最坏的情况是,您可以制作一个32位浮点深度缓冲区

我不能将每个三角形设置在比上一个更高的位置,因为当深度缓冲区限制出现时,在一定高度后,这会导致渲染质量差

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

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

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

因此,任何等分三角形的Z值都是k/N,其中k是该三角形的整数索引。您应该能够轻松地在着色器中执行此操作


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

你可以在深度/模具缓冲区中绘制,然后如果已经有了一些东西,就放弃,但是如果你不在每个像素上做很多工作,那就真的没什么用了。我的意思是,如果你说的是2D,你实际期望有多少重叠?@Cubic,重叠至少在50%左右!50%的重叠是透支的1.5倍。没什么。当你画单色三角形的时候,它是双重无。游戏透支不足2倍是幸运的。@Nicolas,至少50%。高达95%。不过,你希望通过这种方式节省什么样的工作?这些片段仍将生成。丢弃片段不是一个自由的操作。你必须问问自己,丢弃操作是否真的会比你现在做的更快。你可以画进深度/模具缓冲区,然后丢弃,如果已经有了一些东西,但这真的不会做那么多,除非你每像素做很多工作。我的意思是,如果你说的是2D,你实际期望有多少重叠?@Cubic,重叠至少在50%左右!50%的重叠是透支的1.5倍。没什么。当你画单色三角形的时候,它是双重无。游戏透支不足2倍是幸运的。@Nicolas,至少50%。高达95%。不过,你希望通过这种方式节省什么样的工作?这些片段仍将生成。丢弃片段不是一个自由的操作。你必须问问自己,丢弃操作是否会比你现在所做的更快。我认为这不会解决任何问题,集合的多边形基本上会改变zpos,正如我所说的,一段时间后,深度缓冲限制会出现,最后的三角形最多会被错误地渲染。我画了五十多万个三角形。这是一个非常糟糕的主意,即使我必须为每个三角形创建自己的顶点数组,然后逐个渲染它们。这将破坏整个优化,实际上会使它变慢。24位深度缓冲区
有16M的组合:500K 2D三角形如何饱和该精度?使用着色器,您可以通过引入用于写入深度缓冲区的新顶点属性来模拟深度偏移。我认为这不会解决任何问题,集合的多边形基本上会改变zpos,正如我所说,一段时间后,深度缓冲区限制即将到来,最后的三角形最多只能被错误地渲染。我画了五十多万个三角形。这是一个非常糟糕的主意,即使我必须为每个三角形创建自己的顶点数组,然后逐个渲染它们。这将破坏整个优化,实际上会使其变慢。24位深度缓冲区有16M的组合:500K 2D三角形如何饱和该精度?使用着色器,您可以通过引入用于写入深度缓冲区的新顶点属性来模拟深度偏移。我已多次尝试将其设置为24位,但它从未使深度分辨率更好。我不认为这是可能的,只有16位可以工作。@菜鸟:所以所有那些从1998年开始用8位模具缓冲区获得24位深度缓冲区的人都错了。在指责你的显卡做了15年没有做的事情之前,也许你应该看看你的源代码。我曾多次尝试将它设置为24位,但它从未使深度分辨率更好。我不认为这是可能的,只有16位可以工作。@菜鸟:所以所有那些从1998年开始用8位模具缓冲区获得24位深度缓冲区的人都错了。在指责你的视频卡做了15年没有做的事情之前,也许你应该看看你的源代码。