2011-12-20 38 views
4

當我在像素着色器中採樣紋理時,紋理單元需要根據被着色的像素周圍的紋理梯度來選擇mipmap。HLSL tex2D() - 漸變來自哪裏?

有一個功能tex2Dgrad(),讓我提供的信息有關手動梯度和tex2Dlod(),讓我手動選擇紋理貼圖,但如果我只是叫tex2D()那麼哪裏額外的梯度信息從何而來?

tex2D()紋理映射最常見的情況是在大多數着色器中使用,但我不知道漸變來自哪裏。 Mipmapping顯然起作用,所以它必須來自某個地方。

我想在使用計算UV座標的像素着色器使用一個紋理作爲查找表,但我不希望有任何意外「魔力」tex2D()發生。

我需要使用tex2Dlod()來避免這種情況嗎?我讀了tex2Dlod()tex2D()慢。

+0

它來自類似於'ddx'和'ddy'的「魔法」,應用於深度組件 – harold 2011-12-20 17:54:42

+0

Harold ...與深度不同,它不能基於來自頂點階段的任何輸入。我可以計算像素着色器中的任意紋理(u,v)座標,並且mipmapping仍然有效。 – Jinstarr 2011-12-20 19:29:52

+0

u,v座標不會影響mip級別 – harold 2011-12-20 19:37:41

回答

1

GPU一次遮擋4個像素的「四邊形」,並且用於紋理拾取的梯度來自從相鄰像素對計算出的有限差分。這就是GPU如何能夠生成偏導數,即使對於像素着色器中的任意表達式。如果您可以爲您傳遞的值計算更精確的分析導數作爲紋理座標,則tex2Dgrad函數可能非常有用。

+0

我找到了部分解釋該過程的紙張:http://developer.amd.com/media/gpu_assets/04%20clever%20shader%20tricks.pdf – Jinstarr 2012-01-01 15:20:42