2017-07-30 149 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,并直接写入它,而无需使用单独的帧缓冲区对象。