> 文章列表 > Direct3D 12——纹理——纹理

Direct3D 12——纹理——纹理

Direct3D 12——纹理——纹理

纹理不同于缓冲区资源,因为缓冲区资源仅存储数据数组,而纹理却可以具有多个mipmap层级(后 文有介绍),GPU会基于这个层级进行相应的特殊操作,例如运用过滤器以及多重采样。支持这些特殊 的操作纹理资源都被限定为一些特定的数据格式。而缓冲区资源就没有这项限制,它们可以存储任意类 型的数据。纹理所支持的数据格式由枚举类型DXG1_FORMAT来表示。下面是纹理格式文档:

https://learn.microsoft.com/zh-cn/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format

以某种具体类型创建的资源,其格式是不能更改的。这将 使该资源在运行时的访问得以优化[……]。”因此,我们应当只在不得已的情况下才使用 无类型资源,否则就用具体的类型来创建资源。

一个纹理可以绑定到渲染流水线的不同阶段,一个常见的例子是既可将一纹理用作渲染目标(即 Direct3D中的渲染到纹理技术),又能把它作为着色器资源(即在着色器中对该纹理进行采样)。一个纹 理可以当作渲染目标,也可以充当着色器资源,但是不能同时“身兼数职”。将数据渲染到一个纹理后, 再用它作为着色器资源,这种方法称为渲染到纹理(render-to-texture)。

纹理坐标

Direct3D 12——纹理——纹理
Direct3D所采用的纹理坐标系,是由指向图像水平正方向的u轴与指向图像垂直正方向的v轴所组成的。取值范围为0≤u,v≤1的坐标(以,V)标定的是一 种称为纹素(texel)的纹理元素。

对于每个3D三角形来说,我们希望在将要映射于 其上的纹理中定义出与之对应的三角形。设 p0p1以及p2为3D三角形的3个顶点,它们分别对应 于纹理坐标q0q1q2。针对3D三角形上任意一点(x,
y,z)处的纹理坐标(u,v),我们都可以通过与3D三角形坐标插值所用的相同参数s、t,对顶点纹理坐标进行线性插值来求得。这就是说,如果:
Direct3D 12——纹理——纹理
左侧的三角形位于3D空间,我们将把右侧纹理上的2D三角形映射到左侧的3D三角形上

(x,y,z)=p= p0 + s ( p1 - p0 ) + t ( p2 - p0 )

当s ≥ 0, t ≥ 0, s + t ≤ 1 时,那么

(u,v)=q= q0 + s ( q1 - q0 ) + t ( q2 - q0)

依此方法便可求出三角形上每个点处的对应纹理坐标。