2009-08-31 73 views
2

我有一段HLSL代碼看起來像這樣:問題的HLSL循環/採樣

float4 GetIndirection(float2 TexCoord) 
{ 
    float4 indirection = tex2D(IndirectionSampler, TexCoord); 

    for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip--) 
    { 
     indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip)); 
    } 
    return indirection; 
} 

我得到的結果與僅環執行一次是一致的。我檢查了PIX中的着色器,事情變得更加奇怪,指示代碼中位置的黃色箭頭進入循環,經過一遍,然後跳回到開始處,此時黃色箭頭不再移動,但是光標在代碼中移動並返回一個結果(PIX中的一個錯誤,或者我只是使用它錯了嗎?)

我懷疑這可能是一個問題,如果紋理讀取由編譯器移動到循環外部,然而,我認爲,沒有與tex2Dlod發生,因爲我手動設置LOD:/

所以:

1)有什麼問題嗎?

2)任何建議的解決方案?

+0

您是針對SM3還是SM4進行編譯?如果這是DirectX 10,則編譯着色器時可能需要設置D3D10_SHADER_DEBUG和D3D10_SHADER_SKIP_OPTIMIZATION標誌,因爲這可能有助於您追蹤PIX中的問題。 – Tchami 2009-09-01 00:49:20

+0

使用DirectX9編譯爲SM3,這是我可以使用的最高版本,因爲這是XNA – Martin 2009-09-01 08:46:29

+0

好的,自從您將它標記爲DirectX和XNA以來,這並不是很明顯;) – Tchami 2009-09-01 11:11:51

回答

2

問題解決了,這是一個簡單的編碼錯誤,我需要在每次迭代時增加mip級別,而不是降低它。

float4 GetIndirection(float2 TexCoord) 
{ 
    float4 indirection = tex2D(IndirectionSampler, TexCoord); 

    for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip++) 
    { 
     indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip)); 
    } 
    return indirection; 
}