2017-07-30 143 views
-1

所以,我試圖修改一個精靈的特定像素。目前我通過創建自己的SetPixel(int x, int y, Color color)函數來實現它。它通過修改紋理的信息(RGBA值)並將其傳遞給精靈來工作。但是這很慢:具有片段着色器的OpenGL SetPixel

1)使用CPU而不是GPU在哪裏(我希望)我可以使用着色器來提高我的性能。

2)我每次修改單個像素時都必須重新上傳修改後的紋理。

這個問題對我很重要。如何使用着色器來修改特定的像素?我只能修改每個頂點的顏色,這不是我想要的。

有什麼建議嗎?

+1

片段着色器修改幀緩衝區中的所有像素(當您調用drawElements或drawArrays時),而不僅僅是一個像素。如果新的顏色值在CPU程序中,您可以將其上傳到GPU紋理,或將其設置爲片段着色器中的常量變量。 –

+1

你確定你不想一次修改多個像素嗎?上傳1個像素到GPU上傳1000000像素同樣複雜。 –

+1

建議:刪除你的'SetPixel'函數並找出如何去做你沒有它的工作。 – ybungalobill

回答

0

首先,您不必上傳所有紋理,並且在每次像素更新之後。您可以緩存更改並使用glCopyTextSubImage更新最小的矩形。

如果您確實想要嘗試GPU更新,則可以使用計算着色器(但某些舊硬件不支持它們)或將您的紋理數據綁定爲SSBO,並直接寫入它,而無需使用單獨的幀緩衝區對象。