您的位置:首页 > Web前端

面向GPU基于Vertex Texture Fetch的细分曲面构想和初步实现 上

2006-07-29 19:06 405 查看
面向GPU基于Vertex Texture Fetch的细分曲面构想和初步实现


作者:张嘉华、王建光、梁成(女)

华南理工大学计算机科学与工程学院(510460)
指导教师:李桂清
华南理工大学计算机科学与工程学院(510460)
newzjh@126.com、Alceliang@163.net

介绍:

近几年来,面向GPU的图形技术发展非常迅速,可编程着色(Programming Shader)而融入到许多实际应用中了,而细分曲面也已经发展了很久的一段时间,有很多成熟的方法。本文结合作者在做的项目简单地介绍了作者在GPU上通过Vertex Shader和Pixel Shader实现细分曲面的构想。该构想与其它方法网格建模渲染方法相比,只需要非常小的运行时存储空间,只存储模型最简单的能保持特征的三角形网格,在需要高分辨率时,在GPU上通过实时细分产生实际的网格。本构想仍没解决的问题是实时细分所产生的网格的渲染问题。

1、引子

细分曲面在计算机动画、多分辨率编辑分析等方面有广泛的应用。以往有很多计算机网格渲染方法,对于超大规模具有很多三角形面皮的模型,往往采用多分辨率LOD方法,也就是在读入模型的时候建立模型的多个分辨率,当模型接近的时候采用高的分辨率模型,远的时候采用低的分辨率模型,后来随着Huge Hoppe关于渐进网格的提出,微软的Direct 3D在API层实现了渐进网格、增强网格,并能设置LOD层次值,但其往往需要在模型读入时建立模型的各级分辨率或者在运行时需要CPU对模型根据一定的LOD准则不断Refinement和合并,占用很大的存储空间,理论上要存储原模型的33%倍的顶点,对于一个很多三角形面的模型来说,难以实现运行时Out-of-core。而相比之下,基于细分曲面的方法,可以形式化地表示为“基本网格+细分的拓扑规则+细分的几何规则”,在模型读入建立时简化模型到最基本的网格,然后在运行时通过GPU的Vertex Shader Texture Fetch技术不断读入显示缓冲中的以纹理形式存放的细分矩阵,以实时迭代的形式不断Refinement,直至模型分辨率可以接收。我们这种方法与地形的中点位移法分形生成、L-System下植物生成以及过程纹理很类似,也是给定一非常简单的初始素材,根据给定的参数、通过一系列迭代和启发式规则生成满意的目标,其不同点在于本构想是针对模型的,期盼运行时实时实现。

优点:本构想能够运行时实时实现细分、只需很少存储空间存储初始网格、具有可控的实时细分规则、能够易于实现Out-of-Core,无需CPU处理分页和I/O,方法比较简单和容易实现。

缺陷:本构想目前在现有的GPU支持下仍然不能很好地实现,其根本问题在于在目前的图形管线中,Vertex Shader中不能动态地增删顶点,期待日后的Shader Model 4.0和Direct 3D 10、实时改变细分模式、矩阵有待研究具体的实现方案。

2、Overview

本文构想的细分曲面实时渲染的关键有以下几点:
1. 细分曲面可以形式化地表示为“基本网格+细分的拓扑规则+细分的几何规则”
2. 原始网格可以通过常规方法在CPU上化简为基本网格
3. 细分曲面可以实时改变细分模式、细分矩阵和细分规则

下面是我们根据指导老师提出细分曲面流程结合GPU实现的初步框架:

原始网格

基本网格

预处理、化简、优化

细分曲面

实时Refinement

图2:面向GPU的细分曲面实现框架

与我们指导老师的细分曲面流程相比,在这个框架中简单地大致分为两部分:预处理和实时Refinement两部分,省略了重采样、拟合等步骤(由于处于构想阶段,不知道是否存在很大问题)。其中前者是模型读入时在CPU上处理的,包括保证各个三角面夹角小于一定阙值、化间三角形、几何优化、拓扑优化等,最终得到表示细分曲面的基本网格以及通过Render-to-Texture建立细分矩阵纹理和定制几何规则和拓扑规则,这将在第4节介绍;后者是在GPU上通过Vertex-Texture-Fetch以及等技术通过对前一部分以纹理形式存放的细分矩阵的访问,不断迭代产生最终可以接受的细分曲面。

3、细分曲面的数据表示

  
通过对细分曲面的形式表示的分析,我们大致可以得到下面的实体:细分曲面、网格、基本网格、运行时网格、顶点、面、细分矩阵、细分的几何规则、细分的拓扑规则。那么下面简单地对这些实体进行面向对象的设计。
  
3.1 顶点
下面是顶点的具体定义

structure TVCVertex
{
public:
D3DXVECTOR3 position; //顶点坐标
D3DXVECTOR3 normal; //法向量
D3DXVECTOR2 uv1; //纹理贴图坐标
D3DXCOLOR diffuse; //颜色
TVCVertex(D3DXVECTOR3 position, D3DXVECTOR3 normal, D3DXVECTOR2 uv1);//构造函数
};


3.2 面
每个面由三个顶点构成,我们以顶点的索引表示,同时记录下每个面的邻接面。
下面是面的具体定义:

structure CFace
{
int i1; //第一个顶点索引
int i2; //第二个顶点索引
int i3; //第三个顶点索引
};


3.3 网格

下面是网格的具体定义:


Class CMesh
{
public:
vector<TVCVertex> vertexs; //顺序存储的顶点集
vector<CFace> faces; //顺序存储的面集合

};


3.4 原始网格

下面是原始网格的具体定义:


Class COrgienMesh:CMesh //继承于CMesh类
{
public:
static FromFile(const TCHAR*); //从obj等文件中读入并分析原始模型
};


3.5 运行时网格

运行时网格表示根据用户指定细分程度参数运行时生成的具体网格:

下面是运行时网格的具体定义:

Class CRuntimeMesh:CMesh //继承于CMesh类
{
public:
LPDIRECT3DVERTEXBUFFER9 VB; //顶点缓冲
LPDIRECT3DINDEXBUFFER9 IB; //索引缓冲
};


4、原始网格的化简、优化和细分曲面模型的构造

这一节的内容将包括下面这些:
1. 原始网格的化简和优化
2. 基本网格的构造
3. 细化矩阵的纹理表示
4. 几何规则拓扑规则的描述。

之所以将上面这些内容都放到同一节来介绍,主要考虑到它们都在CPU上实现。

4.1 原始网格的化简和优化

  

4.2 基本网格的构造

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: