2012-02-23 60 views
5

好先上去,我使用:的DirectX剪輯空間紋理座標

  • 的DirectX 10
  • C++

好吧,這是一個有點古怪的一個對我來說,我通常不會問這個問題,但我被情況所迫。我有兩個三角形(不是四方,因爲我不會進入!)全屏幕,通過它們未被轉換的事實對齊屏幕。

在DirectX頂點聲明中,我傳遞了3分量的float(Pos x,y,z)和2分量的float(Texcoord x,y)。 Texcoord z保留給texture2d數組,我現在在像素着色器中默認爲0。

我寫這個實現簡單的任務:

float fStartX = -1.0f; 
float fEndX = 1.0f; 
float fStartY = 1.0f; 
float fEndY = -1.0f; 
float fStartU = 0.0f; 
float fEndU = 1.0f; 
float fStartV = 0.0f; 
float fEndV = 1.0f; 
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV)); 
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV)); 
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV)); 

IA佈局:(更新)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = { 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 } 
}; 

數據達到了以下格式的頂點着色器:(更新)

struct VS_INPUT 
{ 
    float3 fPos   :POSITION; 
    float3 fTexcoord  :TEXCOORD0; 
} 

在我的「頂點」和「像素」着色器中,對於此特定繪製調用沒有發生很多事情,像素着色器使用指定的UV座標執行大多數從紋理採樣的工作。然而,這並不像預期的那樣工作,看起來我只得到的採樣紋理的1個像素

解決辦法是在像素着色器做到以下幾點:(更新)

sampler s0      : register(s0); 
Texture2DArray<float4> meshTex : register(t0); 
float4 psMain(in VS_OUTPUT vOut) : SV_TARGET 
{ 
    float4 Color; 
    vOut.fTexcoord.z = 0; 
    vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f; 
    vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f; 
    vOut.fTexcoord.x += 0.5f; 
    vOut.fTexcoord.y += 0.5f; 
    Color = quadTex.Sample(s0, vOut.fTexcoord); 
    Color.a = 1.0f; 
    return Color; 
} 

這也是值得注意的是,曾與以下VS出來的着色器結構定義:

struct VS_OUTPUT 
{ 
    float4 fPos   :POSITION0; // SV_POSITION wont work in this case 
    float3 fTexcoord :TEXCOORD0; 
} 

現在我有一個拉伸到適合整個屏幕的紋理,這兩個三角形已經覆蓋了這個,但爲什麼紋理UV沒有像預期的那樣被使用?

澄清我正在使用一個點採樣器,並嘗試了夾鉗和包裹紫外線。

我有點好奇,發現上面提到的解決方案/解決方法,但是如果有人知道它爲什麼會發生,我寧願不必這樣做。

回答

1

好吧,其中之一,0..1範圍外的紋理座標會被鉗位。我犯了一個錯誤,假設通過將空間-1剪切到+1來表示紋理座標也是如此。事實並非如此,他們仍然從0.0到1.0。

像素着色器中的代碼工作的原因是因爲它使用了剪輯空間x,y,z座標來自動覆蓋這些紋理座標;我的一個疏忽。然而,像素着色器代碼導致在全屏「四邊形」上進行紋理拉伸,所以它可能對某個人有用;)

1

你指定什麼語義爲你的頂點類型?它們是否與頂點以及着色器正確對齊?如果您使用D3DXVECTOR4,D3DXVECTOR3設置(如您的VS代碼所示),如果您的CreateVertex()返回D3DXVECTOR3,D3DXVECTOR2結構,則可能會出現問題。 看到你的像素着色器代碼也會讓人放心。

+0

更新的問題,不太明白它是如何相關的,它不是像我一直沒有在這個環境中工作很長一段時間。 – Jay 2012-02-24 10:55:27

+0

CreateVertex沒有什麼特別的,返回我想要的。唯一可能不同的是texcoord Z未被使用,並且在未來被留下使用紋理陣列。 – Jay 2012-02-24 11:00:32

+0

對齊是正確的,跨步是正確的值24字節,(不是16字節的好倍數,但它應該仍然工作,因爲dx自動填充這個) – Jay 2012-02-24 11:03:57