全部新闻提供最新行业动态,分享前沿设计理念
3D渲染中的技术能解决哪些问题?
时间:2024-06-04 来源:朝夕友人 点击:

谢邀。我比较喜欢提的很清楚的问题,如果没有最后一句话就更好了。:)

1、空间剪裁

在3D渲染的时候,因为GPU的能力,要解决的问题是每帧喂给它要渲染的东西太多就会导致应用的帧率下降(在mobile上计算量太大以至于长时间满负荷也会导致发热量大,电池消耗过快)。因此,对于一个场景中的所有物体,在提交给GPU渲染之前,需要有空间裁剪的方式来快速的去除相机看不到的物体。最基础的也是每个3D引擎必有的是基于相机的平截头体(frustum)的裁剪,也因为只通过平截头体来裁剪的话,大空间的场景会需要消耗很多的CPU资源,所以才产生了其他的如二叉树(Quake使用)、四叉树、八叉树(GB lightspeed使用)以及门(portal)等技术。这些都在平截头体裁剪前发生,用来快速的去除相机看不到的物体。然后剩下的物体再跟平截头体做裁剪计算,如果通过的话才进入GPU进行真正的渲染。

2、纹理混合和绑定技术

这个可以接第一个,如果到GPU渲染的时候,GPU会根据用户的需要,给每个顶点着色(如果这个词太晦涩,那么就是“上色”)。着色可以是直接的颜色,也可以是从一张图(纹理图)中得到。纹理绑定就是告诉GPU,“这次着色如果遇到要从图中取色,那么你用这张图”。这个在OpenGL和DX都是相关的API供用户调用。纹理混合,先说个简单的例子就是苹果手机上的“毛玻璃”效果,展现出的隐隐约约看到图像后面的背景,就是“混合”出来的。把前景的像素(即将被绘制到屏幕的像素)和背后的像素(已经展现在屏幕上的)用一定的算法加、减、乘在一起,这样最后的展现出的像素就是前后两个像素的颜色的混合体。纹理混合就是告知GPU需要做这样的事情,可能是多张纹理间混合色彩,可能是跟背景色混合色彩。也对应到OpenGL和DX的不同的API。

3、一维纹理(1D),容积纹理(Volumetric textures),体积纹理(Cubemaps)和压缩的纹理格式如:DXTC

常见的是2D纹理,2D纹理就是我们在计算机上看到的平面的图,在读取这张图的每个像素的时候,我们需要有两个变量,一个代表在横向的索引位置,一个代表在纵向的索引位置。每一对这两个变量,都对应到一个2D纹理里面的确切的像素。1D纹理就是只要一个变量就够了,对这种纹理图,0索引就是第一个像素,1就是第二个,以此类推。

Cubemap,因环境映射等需要而产生,作用是可以把相机放在场景中,拍下上下左右前后六个方向的快照,做成cubemap图(如下图所示),然后供物体渲染的时候使用,实现物体能对周围环境反射的性质。

注:

上图的空白部分不是有效的像素,索引这张图的有效像素,需要三个变量,一般在3D中用uvw。

容积纹理,也就是3D纹理。与Cubemap的差别在于,Cubemap是6张图,在3D纹理中是N张图。如果以下图的Level0所示,就可以是Depth张Width x Height的2D图组成。再举例来讲,如果是一张16x16x16的3D纹理图,那么其实代表的是16张16x16的2D图组成。

本部分感谢

的资料,修正了原来的错误。上图来自于微软的资料,在评论里

的评论有这个链接。

DXTC,png、jpg等都是很常见的压缩格式了。但是这些压缩格式并不被GPU支持,在png、jpg的图被送往GPU的时候,这些图会被解压缩成正常格式,会占用大量的GPU内存。然而,有些格式却是能够被GPU支持的,譬如这个DXTC,开始叫做S3TC。这个系列有名一点的是DXT1、DXT3、DXT5。

4、渲染到纹理(Render-to-Texture)技术和投影纹理(贴花,Projective Texturing-decals)

渲染到纹理,是Render-to-Target的一种特殊情况,GPU的渲染,最后会把产生的图像数据写到相关的地方(内存、显存)。常见的就是一步写到给显示器刷新的显存,显示出来。但是很多写程序的人发现,有时候他们需要GPU渲染出来的结果不直接显示出来,而是要能输出到某个可以被程序访问的地方,供二道加工或者只做中间使用。所以就产生了把GPU的渲染输出放到中间缓存/内存的需求,放置后的结果,API会让程序员以Texture的方式访问,就是这里的Render-to-Texture。

投影纹理,是一个技术,让一张图(作为贴花的图),通过类似相机的投影的技术,把2D的图贴到3D空间的物体(们)的表面上,因为用了投影技术来产生结果,大多数用在贴花效果上,所以叫做Projective Texturing-decals

5、材质LoD(细节层次,mipmapping)技术

3D空间中的物体,因为有远小近大的事实,远处的物体在屏幕空间(2D的空间)上占用的像素少,所以如果对远处的物体用很高质量的模型,最后渲染出的结果跟用个低模产生的效果可能是等效的。但是渲染这两个物体(高模与低模)对GPU的计算量有很大的差别,所以就产生了lod的技术。对材质的lod,用所谓的mipmapping,也是一个道理。都体现了用空间换时间的概念。

6、顶点和索引缓存(vertex and index buffers)、顶点声明(vertex declarations)以及贴图缓存(buffer mappings)

顶点数据(包含位置、法线等)是一个模型的顶点的数据流,组成这个模型的顶点都在这里。索引缓存是为了告诉GPU哪些顶点组成哪些三角形,可以实现顶点的复用,节省顶点数据。顶点声明,也就是所谓的顶点的layout,是因为GPU并不能主动知道顶点数据究竟由哪些含义的数据组成,举例,一个顶点可以只有position信息,也可以拥有position、normal、tagent、joint等等信息。所以需要外界告知它送入的顶点流是什么样的形式。

贴图缓存我第一次听到,所以不知道。

7、软件和硬件加速蒙皮

蒙皮是让骨骼带动顶点形成整个模型的动画,软件蒙皮是CPU来计算这个事情,硬件是GPU来做。如果问为什么产生这个技术,是因为原先是CPU做,CPU好累。所以如果GPU也能做的话,就让GPU来做咯。

8、静态几何体批次(static geometry batching)

batching是利用一定的算法把几个模型组合在一起,作为一个东西送给GPU渲染的方式。要解决的问题是,cpu向gpu送数据是有成本的,所以如果送2次能化成1次,就能节省很多的时间。静态批次我不是很清楚,但是可以猜想应该是在程序装载的时候就把相关的物体预先“打包”成一个东西。这样解释是因为原理上可以在程序运行中的时候,利用相关的算法“打包”,这样就算是动态的。

9、二次贝塞尔曲面(biquadric Bezier patches)

略过,不熟。

10、模版阴影(stencil),纹理阴影(texture),叠加阴影(additive),调制阴影(modulative)

模板阴影,全称如果是Stencil Shadow Volume,是3D引擎中生成物体的影子的一种方式。生成影子,可以使用Shadow map的方式(类相机的投影方式生成参考的影子图)。从历史来看,先是有Stencil Shadow(1977),然后有了Shadow mapping(1978)。都是为了在3D引擎中实现阴影效果。前者需要在runtime生成一个阴影体,会消耗一些计算资源。后者的速度会快很多。前者相对精确一点,后者会依赖分配给的材质内存的大小,而产生不同精度的阴影。

纹理阴影,如果是texture shadow的话,也就是上面提到的shadow mapping

Additive 和 Modulative是个通用的概念吗,好像只在orge中有。不知道为什么产生这两个概念。

后记:

今天心情很好,:)所以拿来就答了,一答发现写多了,但是还是写不全,还有写的也许不清楚的地方,仅希望给需要的人读一读吧。有错请直接指出,让我也少走弯路。

如果您也有此需求,欢迎咨询我们立即咨询