Tangent,binormal和其他与着色器相关的东西

Yip*_*Yay 8 3d shader normals

许多映射技术(包括法线凹凸贴图,视差贴图等)都需要特殊的每顶点切线空间(切线,法线,副法线/比特).

这显然意味着,我的模型不仅要出口的顶点位置,纹理坐标每个顶点的法线近似,而且切空间的基向量(通常是一个tangent),因为另外一个可以直接在着色器中使用cross(tangent, normal).

请注意,position,normal,uv和tangents实际上是以下列方式相互依赖的(您必须知道关于顶点的所有其他内容以准备切线基础).

position -> normal ->  tangents
            uv     ->
Run Code Online (Sandbox Code Playgroud)

现在 - 在现代3D游戏/渲染引擎中如何处理这类事情?

它们实际上是为每个顶点提供法线,切线uv坐标还是可以在运行时以某种方式计算它们?它们应该是模型数据的一部分还是应该是仅运行时属性?

我也知道,当使用Direct3D10+几何着色器时,实际上可以在运行时准备法线和切线(显然,因为我们可以访问每个三角形中的顶点) - 是否值得或者这些东西是否应该总是预先计算

Kos*_*Kos 6

我的观点如下:

UV坐标:明确预先计算.复杂模型的UV展开不是一项简单的算法任务,通常涉及手动放置接缝以获得最佳结果.此外,如果您的模型带有纹理外观,则UV需要与外观匹配,因此在这种情况下,它们可能无法在运行时计算.

法线:从理论上讲,您可以在加载过程中在几何着色器中甚至在CPU上预先计算它们.但有一件事:游戏中的真实模型通常不是原始模型,而是具有较低多边形数量的版本.在游戏中使用的最终模型中,您具有较少的顶点,但是从原始的高多边形模型(其也用于环境遮挡计算等)更精确地计算每顶点法线.因此,预先计算法线也是可行的.

此外,在许多游戏中,为了稍后在像素着色器中进行并行映射的目的,为每个模型提供具有每纹素法线贴图(通常在切线空间,AFAIK中)的纹理以及每个模型的颜色纹理.

因此看起来我的建议很明确 - 去预先计算的数据,有更好的细节并保存着色器处理或加载时间 - 除非您需要担心模型大小(即GPU内存限制) - 只有在几何中计算法线着色器可以为您节省一些空间.