2013-07-26 60 views
1

如何手動設置像素在PixelShaderFunction HLSL的紋理中最終位置?理想情況下,我希望GPU遵循下一個邏輯:HLSL在像素着色器中設置像素位置以控制像素在紋理中的最終位置

  1. 以不特定的順序逐個寫入像素。意思是每當第一個像素出來時,將其寫入紋理的左上角。在第一個的右邊寫第二個,第一個的右邊寫第三個,依此類推。
  2. 當你到達行的末尾時 - 轉到下一行。
  3. 當您到達紋理的末端時 - 刪除所有剩餘的像素。

謝謝。

我覺得我可以通過在頂點着色器級別手動計算我的像素所需的位置來做到這一點。如果我能更好地理解像素定位如何工作,我可能會將其拉出。如果我有一個渲染目標2000 * 4。我怎樣才能確保在頂點着色器級別我的像素將在第二行結束?

如果我的RenderTarget是一個高度爲1的紋理,那我該怎麼辦?或者我有通過像素合併丟失數據的風險?我計劃在屏幕上劃一條長長的線,逐一清除目標。

回答

0

基本上你不能做你所描述的。

在頂點着色器之後,GPU會繪製一系列三角形。它將它們逐像素地填充到渲染目標(可能是後緩衝區)。作爲填充過程的一部分 - 爲了確定每個像素的顏色 - 您的像素着色器被調用(像一個函數)爲被填充的特定像素。此時沒有能力「移動」輸出像素。

什麼你可以要做的就是調節你的像素着色器從紋理採樣時,紋理座標參數tex2DMSDN)。您可以申請任何functions以達到您想要的效果。或者,如果變換很簡單,則可以在頂點數據中或使用頂點着色器來簡單地設置紋理座標。

+0

我想要實現的是:我的通行證將返回一個巨大的數組與幾個唯一的數字重複反覆,我需要檢索和CPU上處理。我試着渲染成2000x1紋理,然後用RenderTarget2d.GetData <>()和foreach循環在CPU上採樣。這非常慢:)。所以我回避了我的問題,現在的想法是多次渲染到1x1紋理。 Inbetween階段,我將在我的着色器中擴展一個參數數組,以包含已經返回的數字。 – cubrman

+0

每個像素都會查詢數組,並且如果它包含已經出現的數字,則自行裁剪。現在的問題是,像素顏色永遠不會改變我呈現的內容。是否因爲我把太小的內容渲染到屏幕上(我正在屏幕上繪製一條線並沿着線條對場景的顏色進行採樣)?這裏是鏈接到另一個線程,我問這個問題:http://stackoverflow.com/questions/17888689/rendering-a-line-into-a-1x1-rendertarget2d-does-not-change-the-targets-pixel -co – cubrman

+0

這聽起來像是你試圖實現「某些東西」,並且你已經決定了一個解決方案 - 這不一定很好 - 而且你在問如何實現這個解決方案。相反,當你應該從更高層次開始解釋你的「東西」是什麼,並尋求實現它的最佳方式。(可能是因爲你的解決方案是正確的 - 但是至少它可以爲你的其他問題提供一些背景信息 - 如果沒有這個背景,這些問題會令人困惑。) –