2010-09-29 224 views
3

我正在用Java编写游戏LJGWL(OpenGL)。我正在使用一个为我处理大量混乱细节的库,但需要找到更快的方法来完成此操作。OpenGL着色器?

基本上我想设置屏幕上的每个像素以尽可能快的速度说随机颜色。 “随机颜色”只是一个数组[] [],每2-3秒更新一次。我已经尝试绘制正反面和使用图像,两者对于我想要做的都很慢。

我想我想学习如何编写GPU着色器?这是做到这一点的最快方法? LJGWL将OpenGL API暴露给java。任何有关如何开始使用OpenGL着色器的基本教程?或者我应该动态创建某种纹理,然后抛出整个纹理,会更快吗?

+2

每个像素都是一样的随机颜色,还是每个像素都有不同的随机颜色? – Will 2010-09-29 20:13:52

回答

6

如果是,你是静态显示同一图像,比使用一个纹理或显示列表就足够了的情况。但是,如果你想经常更新它,着色器确实是最好的选择。 Shader代码在GPU上执行并修改GRAM中的数据,因此您不需要从CPU转移到GPU。接下来最好的事情可能是一个像素或帧缓冲区对象。缓冲区对象允许您通过DMA读取/写入GRAM(无需通过CPU),因此它们可以非常快速。

我还没有写任何着色器,所以我不能推荐任何好的资源。但是SongHo's OpenGL pages是了解缓冲区对象的好地方。 (他的例子都是用C++做的)虽然

2

纹理是在屏幕上绘制的东西,画以最快的方式一个纹理映射四到画面中,它应该是速度不够快。当您需要重新上传纹理数据时,请使用glTexSubimage2D对其进行更新。

不需要使用着色器。

+0

+1,另一个提示是使用PBO来存储这些“随机像素”数据 – erjot 2010-09-30 11:40:00

0

我还没有做在OpenGL着色器的任何工作,但鉴于在多个场合相同的情况下,我与纹理我扔了在屏幕顶部处理它,它非常有效的工作。

0

我不知道你是如何绘制准确的像素,但是这个限制你打可能是因为数据的传输你的金额(低效?)。每隔2-3秒更新一个充满像素的屏幕应该不会太难。尽管着色器能让你更好的显卡,他们将永远不会低效的方法快,所以......

为什么你的代码这么慢?

  1. 什么码?你试过什么代码?你使用什么纹理,渲染到...?
  2. 速度慢吗?有多慢?你期望它有多快?
  3. 在视频RAM中,速度能达到1920x1080(?)像素的速度有多快?您的硬件,驱动程序和操作系统是什么?

我想你需要编辑/转贴,然后才能帮助你解决问题。仅仅因为速度很慢,并不能保证所有的着色器甚至会更快地位于