5页面自适应屏幕大小_[GPU Gems3] 5. 网格自适应的优化

Chapter 5. Generic Adaptive Mesh Refinement​developer.nvidia.com
5478531151fec7db89e6bebb5b218698.png

介绍

本文通过顶点程序对任意拓扑形状的网格进行动态的自适应优化。网格优化技术将表面的描述分割成粗糙的多边形网格,而使用连续的置换函数将它们连接起来。然后在渲染的时候,对粗糙网格进行细分和位移操作。细分把粗糙网格的每个多边形分割成一系列小三角形。位移通过位移函数给出的向量方向移动这些顶点。本文方法依赖于质心坐标来执行一个一致的、具有任意适应性的细分过程。

本优化方法的一个主要优点在于仅CPU层处理低分辨率的网格,而使GPU适应性地产生高质量替代网格。目标网格不会在CPU中产生也不会在图形总线上传输,甚至不会存储在GPU上,唯一瓶颈在于GPU的顶点运算能力。

本文提出的通用网格自适应的优化技术(generic adaptive mesh refinement, GAMeR)提供了以下特性:

  • 不需要预处理过程就可以表示标准几何体,也不需要额外的数据结构
  • 只有粗糙的网格从CPU传到GPU,需要的额外数据是逐顶点的缩放属性,称为深度标签(depth tag),标记了每个顶点附近需要的LOD,既可以自动生成也可以用户指定
  • 网格优化动态执行,因此可以获得任意LOD
  • 细分和位移都在顶点程序中单过程执行

GAMeR的工作架构如下,核心思想在于对单个三角形各顶点的深度标签中所有可能的优化结构进行预处理,并使用质心坐标进行编号。每个可能的配置称作自适应优化模式(adaptive refinement pattern, ARP),并存储在顶点缓冲中。渲染时将各个属性传输到GPU并根据深度标签选择对应ARP,根据ARP中的质心坐标进行细分和位移。

aa12fa941710e6c32ec3e199a0118f74.png

此外,之前在GPU Gems2中也提到过另一种自适应细分和位移的做法:

Tolo:[GPU Gems2] 7. 带有位移映射的细分表面的自适应镶嵌​zhuanlan.zhihu.com

实现

ARP

在GAMeR的初始阶段,所有可能的ARP被计算一次,并且存储在一个被称为ARP池的三维矩阵中,根据三条边对应的深度{i,j,k}来索引对应的ARP值。

5d5093f7365e9184803a97e7b44b494d.png
(a)预处理的ARP三维矩阵;(b)同样配置的深度标签{3,4,5}对应的不同优化拓扑结构

每个ARP的结点通过质心坐标来编号。在顶点程序中,被优化的顶点的质心坐标会替代其原有的位置gl_Vertex。要在光栅化阶段达到最大的效率,ARP被编码为一个关于细分三角形的、有序化的顶点缓存,直接存储在GPU内存中。在渲染阶段,要执行的唯一操作就是绑定所选的ARP的序号缓冲区,而顶点缓冲区则始终保持一致。

深度标签计算

计算深度标签通常的选择包括了视点到顶点的距离、局部曲率、对象的重要程度、突出点或是对这些值的综合。一旦深度标签被计算,每个粗糙多边形的属性便以一致变量的形式传输到GPU中,并且使用深度标签配置来选择合适的ARP序号缓冲区。每条边的深度由相邻顶点的深度标签取平均得到。

6b21544b024751170e217bba1287159a.png
(a)CPU以进行深度标签处理的粗糙模型;(b)基于距离的标签的结果;(c)基于曲率的标签的结果

CPU阶段的渲染循环

CPU阶段,应用程序只需要计算逐像素的深度标签,从ARP池中绑定合适的序号缓冲区并且绘制它即可。

GLuint ARPPool[MaxDepth][MaxDepth][MaxDepth]; 
. . . 
void render(Mesh M) {   
	if (dynamic)     
		for each Vertex V of M do       
			V.tag = computeRefinementDepth (V);     
		for each CoarseTriangle T of M do {       
			sendToGPU(T.attributes);       
			bind(ARPPool[T.v0.tag][T.v1.tag][T.v2.tag]);       
			drawElement();   
		} 
}

GPU阶段的优化处理

顶点程序包含三个阶段:

  1. 细分阶段:简单的对粗糙三角形顶点进行插值
  2. 置换阶段:对连续的置换函数进行采样和插值
  3. 传统的着色阶段
const uniform vec3 p0, p1, p2, n0, n1, n2; 
// User-defined Displacement Function 
float dispFunc(vec3 v) {. . .} 

void main(void) {   
	// Tessellation by barycentric interpolation   
	float u = gl_Vertex.y, v = gl_Vertex.z, w = gl_Vertex.x; // w=1-u-v   
	gl_Vertex = vec4 (p0*w + p1*u + p2*v, gl_Vertex.w);   
	gl_Normal = n0*w + n1*u + n2*v;   

	// User-defined Displacement Function   
	float d = dispFunc(gl_Vertex.xyz);   
	gl_Vertex += d * gl_Normal;   
	// Shading and Output   
	. . . 
}

结果

05f8f2e6b4da78d42f01435d43d3dcaa.png
使用三次贝塞尔曲面来光滑化,并使用PN三角形

a153b0deef3dc46587a082d75838d7ca.png
不需要对输入的粗糙网格进行预处理,因此它们可以实时动态改变

a8ff7874d3ea4f1c3a664d3b0dd2c81a.png
对任意拓扑结构的单步自适应优化

3927277e83cc5ba47bb80df5373b7ee3.png
复杂的形状可以使用程序化函数以简单的网格来表述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值