许多映射技术,包括法线凸映射、视差映射等,都需要特殊的每顶点切线空间基(切线、法线、双法/双正态分布)。
这显然意味着我的模型不仅应该导出顶点位置、纹理坐标和逼近的每一个顶点法线,还应该导出一个切线空间基向量(通常是tangent
),因为使用cross(tangent, normal)
可以在着色器中直接找到另一个。
请注意,位置,法线,紫外线和切线实际上相互依赖的方式如下(你必须知道其他关于顶点的一切,以准备切线基)。
position -> normal -> tangents
uv ->
现在,在现代3D游戏/渲染引擎中,这类事情是如何处理的?
它们实际上提供了每个顶点的法线__、切线和uv坐标,还是可以在运行时计算它们?它们应该是模型数据的一部分,还是应该是只运行时的属性?
我还知道,当使用几何图形着色器使用Direct3D10+
时,人们实际上可以在运行时准备法线和切线(显然,因为我们可以访问每个三角形中的顶点)--这值得吗?还是应该总是precomputed__??
发布于 2010-11-11 10:54:17
我的意见如下:
UV坐标:显然是预先计算出来的。UV展开一个复杂的模型不是一个简单的,算法的任务,通常需要手工放置接缝,以获得最好的效果。另外,如果您的模型带有纹理皮肤,那么UVs需要匹配外观,因此在这种情况下,它们可能不会在运行时进行计算。
Normals:理论上说,您可以在几何着色器中,甚至在加载期间,在CPU上预计算它们。但有一件事:游戏中真正的模型通常不是原始模型,而是多边形计数较低的版本。在游戏中使用的最终模型中,你有较少的顶点,但每个顶点法线从原始的高聚模型(也用于环境遮挡计算等)中计算得更精确。因此,对法线进行预计算也是可行的。
此外,在许多游戏中,纹理与每纹理法线映射(通常在切线空间,AFAIK)与颜色纹理一起为每个模型提供,以便稍后在像素着色器中并行映射。
因此,我的建议似乎很明确--采用预先计算的数据,有更好的细节并节省着色器处理或加载时间--除非您需要担心模型大小(即GPU内存限制)--只有在几何图形着色器中计算法线才能节省一些空间。
发布于 2010-11-14 01:37:48
通常,您需要尽可能多地预计算。大多数引擎将有一个自定义的书面工具,可以接收来自3D软件的原始数据,并将其按摩为运行时的格式(添加切线和双值,等等)。然而..。
在某些情况下,每个顶点内存开销可能是一个特定的性能问题。这是因为与移动系统的数据相关的开销--它是“隐藏的”,因为它不是添加到着色器中的指令的显式,所以它更高级一些。
在这些情况下,双元可能不是预先计算的,而是在运行时构造的(以减小内存中顶点的大小)。Bitangents适用于此,因为它们可以由normal、切线和方向性标志构建--这些都是单个顶点的属性。
Normals、一些UV映射和其他东西需要了解网格的“拓扑”--而且这种拓扑通常不存在于运行时数据中。他们也需要艺术家额外的标记,比如锋利的边缘和纹理缝,等等。因此,法线、UVs和第一个切线几乎总是对所有非常特殊的几何类型进行预先计算。
请记住,在Max、Maya或Blender中模型的表示与运行时版本非常不同。
编辑软件
三角形和四边形的
。
运行时(用于DirectX、OpenGL等)
texture)
存在于多个细节级的中)。
一般来说,你会丢失很多无法重建的信息。你的艺术家将是最幸福的,如果你做了尽可能多的原始马克斯/玛雅版本的几何。
发布于 2010-11-09 09:52:15
您也可以使用ID3DXMesh在D3D9中完成这一任务。您应该始终提前计算它们,因为在运行时再次计算它们是很浪费的。然而,对于每个网格,您只需要计算它们一次,所以除非您的程序在过程中生成网格,否则它很可能不是在何时何地完成的问题。
这里唯一重要的是在CPU上,而不是在GPU上计算它们,因为你一次又一次地在GPU上做每一个帧,这与CPU上的一次相比是完全浪费的。据我所知,所有3D渲染系统只计算一次法线和CPU上的法线,将其保存到文件中,然后加载它并将其发送到GPU进行工作。
https://stackoverflow.com/questions/4118847
复制相似问题