D3D12渲染技术之纹理坐标

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/82827496

Direct3D使用纹理坐标系,该坐标系包含一个水平延伸到图像的u轴和一个垂直于图像运行的v轴。 坐标(u,v)使得0≤u,v≤1,纹理上称为纹理像素的元素。 请注意,v轴在“向下”方向上为正(见下图)。 另外,请注意使用的归一化坐标间隔[0,1],因为它为Direct3D提供了与维度无关的范围;例如,无论实际纹理尺寸是256×256,512×1024还是2048×2048像素,(0.5,0.5)总是指定中间纹理像素。 同样地,(0.25,0.75)将纹理元素识别为水平方向上总宽度的四分之一,以及垂直方向上总高度的四分之三。 目前,纹理坐标始终在[0,1]范围内,但稍后我们将解释当您超出此范围时会发生什么。
在这里插入图片描述
上图就是纹理坐标系,有时称为纹理空间。
在这里插入图片描述
左边是三维空间中的三角形,右边是我们在纹理上定义一个2D三角形,它将被映射到3D三角形上。
对于每个3D三角形,我们要在纹理上定义一个相应的三角形,以映射到3D三角形上(参见上图)。 设p0,p1,
p2是具有各自纹理坐标q0,q1和q2的3D三角形的顶点, 对于3D三角形上的任意点(x,y,z),其纹理坐标(u,
v)通过相同的s,t参数在3D三角形上线性插值顶点纹理坐标而找到,也就是说,如果
在这里插入图片描述
这样,三角形上的每个点都有一个相应的纹理坐标。
为了实现这一点,我们再次修改我们的顶点结构,并添加一对纹理坐标,用于标识纹理上的一个点, 现在每个3D顶点都有一个相应的2D纹理顶点。 因此,由三个顶点定义的每个3D三角形也在纹理空间中定义2D三角形(即,我们已经为每个3D三角形关联了2D纹理三角形)。

struct Vertex
{
  DirectX::XMFLOAT3 Pos;
  DirectX::XMFLOAT3 Normal;
  DirectX::XMFLOAT2 TexC;
};
std::vector<D3D12_INPUT_ELEMENT_DESC> mInputLayout =
{
  { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
   D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
  { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, 
   D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
  { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, 
   D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
};

请注意,在上图中,我们将整个纹理图像映射到立方体的每个面上。 我们只能将纹理的子集映射到几何体上, 实际上,我们可以在一个大的纹理贴图上放置几个不相关的图像(这称为纹理图集),并将其用于几个不同的对象(见下图), 纹理坐标将决定纹理的哪个部分映射到三角形。
在这里插入图片描述
在一个大纹理上存储四个子纹理的纹理图集, 设置每个顶点的纹理坐标,以便将纹理的所需部分映射到几何体上。纹理图集在引擎中使用的非常多,比如Unity引擎和UE4引擎在UI上就是用图集优化内存加载。

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/82827496
今日推荐