2009-05-04 157 views
4

我試圖在Direct3D中繪製2D圖像到屏幕上,我假設必須通過將貼圖映射到投影填滿屏幕的矩形廣告牌多邊形來完成。 (我不感興趣或不能使用Direct2D。)我在SDK中找到的所有紋理信息都描述了從文件加載位圖並指定紋理以使用該位圖,但我尚未找到操作方法紋理作爲逐個像素的位圖。如何設置Direct3D紋理中單個像素的顏色?

我真正喜歡的是作爲

void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);

這樣的功能,如果我不能在紋理對象直接設置像素,我需要保持周圍一個DWORD數組,它是在位圖,然後將紋理分配給每一幀?

最後,雖然我最初假設我將在CPU上這樣做,但每個像素的顏色計算也可能在GPU上完成。設置紋理中單個像素顏色的HLSL代碼,還是僅用於修改顯示像素的像素着色器?

謝謝。

回答

4

首先,你直接問:

你可以從技術上講,在紋理像素集。這將需要使用LockRectUnlockRect API。

在D3D上下文中,「鎖定」通常指將資源從GPU內存傳輸到系統內存(從而禁止其參與渲染操作)。鎖定後,您可以根據需要修改填充的緩衝區,然後解鎖 - 即將修改的數據傳回GPU。 通常鎖定被認爲是一個非常昂貴的操作,但因爲PCIe 2.0這可能不再是一個主要關注的問題。你也可以指定一個小的(甚至是1像素的)RECT作爲LockRect的第二個參數,因此需要存儲器傳輸一個可以忽略的數據量,並且希望驅動程序確實足夠聰明,足以傳輸這個(我知道的事實在年長的nVidia車手中,情況並非如此)。

實現這種效率的更高效(和代碼密集型)方法確實永遠不會離開GPU。如果您將create your texture作爲RenderTarget(即將D3DU​​SAGE_RENDERTARGET指定爲其參數usage),則可以在執行繪製調用之前將其設置爲管道的目標,然後編寫着色器(可能爲passing parameters)來繪製像素。渲染目標的這種用法被認爲是標準的,你應該能夠找到許多代碼示例 - 但除非你已經面臨性能問題,否則我認爲這對於單個2D廣告牌來說是一種矯枉過正。

HTH。

相關問題