1. 程式人生 > >D3D12渲染技術之紋理座標

D3D12渲染技術之紋理座標

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上就是用圖集優化記憶體載入。