2010-09-05 81 views
1

我需要計算分配給從某個角度在屏幕上繪製給定對象時產生的像素的最小和最大UV值。例如,如果我有UV映射的立方體,但只有正面可見,則應將min(UV)和max(UV)設置爲分配給可見面像素的最小和最大UV座標。獲取最小和最大渲染的UV值(Direct3D)

我想使用Direct3D 9着色器(以及儘可能最低的着色器模型)來加速處理。頂點着色器可以像獲取每個輸入頂點的UV座標一樣簡單,並將它們未經修改地傳遞給像素着色器。另一方面,像素着色器必須採用頂點着色器生成的值,並使用它們來計算最小和最大UV值。

我想知道的是:

  1. 如何維持像素着色器的調用之間的狀態(電流的最大值和最小值)?
  2. 如何獲得着色器生成的最終最小值和最大值到我的程序中?

有沒有辦法在HLSL中做到這一點,還是我堅持用手工做?如果HLSL不起作用,那麼在不使用着色器的情況下最有效的方法是什麼?

回答

1

1)你不知道。 2)你將不得不在某個時候回讀。這將是一個相當緩慢的過程,並導致管道失速。

總的來說,我想不出一個好辦法來做到這一點。你到底在想什麼?可能還有其他一些方法可以達到你以後的結果。

您「可能」能夠使用多個渲染目標獲取某些內容,並將每個像素的UV寫入渲染目標。然後,您需要將渲染目標傳遞迴主內存,然後解析它以獲取最小值和最大值。這是一個非常緩慢且非常難看的解決方案。

如果你可以把它作爲一對單獨的傳球,你可以渲染到一個非常小的渲染目標,並使用1次傳球和1次傳球以及1次最小阿爾法混合傳球。再次...不是一個好的解決方案。

+0

我需要知道正在採樣的UV空間的範圍,以便我可以從大紋理圖像(對於視頻卡要處理的太大)採用矩形部分,並將這些像素複製到足夠小以適合的較小紋理視頻內存。 – 2010-09-05 21:01:31

+0

爲什麼不能分割紋理並相應地提前調整UV? – Goz 2010-09-05 21:27:58

+0

我不明白你的意思。如果我不知道要渲染哪個UV空間子集,我將如何知道要複製哪個紋理子集? – 2010-09-05 21:32:43