【发布时间】:2013-12-05 21:58:59
【问题描述】:
地形细分: 我正在使用剪辑贴图截头体剔除和镶嵌着色器渲染我的地形。现在为了进一步提高性能,我想以更有效的方式使用一些曲面细分着色器。我的目标是实现相当高的帧速率(~100 FPS)和良好的视觉质量,所以我将结合 3 个细分因素、一个细分贴图、依赖于视图的细分(每个边缘的像素)细分和轮廓细分。
我的想法是它们的加权平均值:
tessfac = tesscoeff*(w1*tessmapfactor+w2*silhtessfactor+w3*ppetessfactor)/(w1+w2+w3);
这 3 个因素在 0...1 之间变化,并且 tesscoeff 也可以是统一的以调整水平。我有地图和边缘半径因素,但是......
剪影:
如何在使用简单y(x,z) 函数描述的网格上找到轮廓补丁?我正在使用 vertex-texture-fetch 所以我知道相邻的顶点/法线。如果我使用四边形而不是三角形,或者它不会使查找它们变得更加困难,这会不会有问题?
(已编辑回补丁) Backpatch Culling:我遇到的另一个问题是背面剔除。正如我所说,我正在使用四边形贴片,因此可能不会躺在平面上。对于三角形,我会将法线与眼睛方向进行比较,但在四边形上我不能,或者不知道该怎么做。
遮挡剔除:我正在使用几何剪辑贴图渲染地形,算法如下:
foreach(LOD)
foreach(quarter)
foreach(quad in quarter) //I mean x+z+, x-z+, x-z- and x+z- by quarters
quad.clipFrustum();
if(inFrustum) quad.render();
endloop
endloop
endloop
我有一个简单的n*n 四边形混乱的顶点缓冲区。我有这个网格的 4 个索引缓冲区,一个用于这个四边形的每个象限。对于LOD=0,我渲染 center/bottom left 四边形,而对于其他级别,我只渲染 L 形混乱与其他 3 个 (top,topleft,left) 象限,按pow(2,LOD) 缩放。然后用一个常数(gridscale)对整个网格进行缩放。
由于整个网格被放置在摄像机前面的每一帧中,因此网格总是从视图原点逐个象限地渲染。也许它可以用于镶嵌控制着色器中的一些剔除,如 early-z 或 occlusion?
我正在寻找一些关于这些的指针,因为我发现的只是一些没有太多技术背景的 NVIDIA/AMD 论文。 http://www.geeks3d.com/20101201/amd-graphics-blog-tessellation-for-all/全文链接也失效了……(来自这篇文章:OpenGL Low-Level Performance Questions)
【问题讨论】:
-
关于背面-face 剔除,您是否在此应用程序中绑定了原始程序集?背面剔除通常是一种光栅化操作,但在过去的几年中,原始设置非常昂贵,以至于引擎有时会在顶点级别剔除三角形(回想一下 Quake 3,它会计算每帧在 CPU 上绘制的三角形列表)。一些 PS3 游戏仍然这样做,因为这是一种让 CELL 处理器忙于工作以减少整体 RSX 负载的简单方法,但这些天大部分时间背面剔除是为了减少片段绑定应用程序的负载。
-
我认为你会从 back-patch 剔除中受益更多。在您必须决定是否丢弃它们生成的单个图元之前,先剔除整个补丁。
-
我要做的是通过将曲面细分级别设置为 0 来剔除背面补丁。这不是称为背面补丁剔除吗? (在编辑之前我写了'back-face',它被更正为'back-patch')
标签: performance opengl tessellation