【问题标题】:OpenGL Shaders?OpenGL着色器?
【发布时间】:2011-04-19 00:49:42
【问题描述】:

我正在用 Java LJGWL (OpenGL) 编写游戏。我正在使用一个为我处理很多混乱细节的库,但需要找到更快的方法来做到这一点。

基本上,我想将屏幕上的每个像素设置为尽可能快地说出随机颜色。 “随机颜色”只是一个每 2-3 秒更新一次的数组 [][]。我已经尝试过绘制矩形和使用图像,对于我想要做的事情来说,两者都很慢。

我想我想学习如何编写 GPU 着色器?这是最快的方法吗? LJGWL 向 java 公开 OpenGL api。关于如何开始使用 OpenGL 着色器的任何基本教程?或者我应该动态地创建某种纹理,然后直接抛出整个纹理,这样会更快吗?

【问题讨论】:

  • 每个像素为相同的随机颜色,还是每个像素为不同的随机颜色?

标签: java opengl gpu


【解决方案1】:

纹理是在屏幕上绘制东西的最快方式,将纹理映射的四边形绘制到屏幕中,它应该足够快。当需要重新上传纹理数据时,使用 glTexSubimage2D 进行更新。

无需使用着色器。

【讨论】:

  • +1,另一个提示是使用 PBO 来存储这些“随机像素”数据
【解决方案2】:

我还没有在 OpenGL 中使用着色器做任何工作,但在多次出现相同场景的情况下,我使用我在屏幕顶部扔出的纹理来处理它,并且效果非常好。

【讨论】:

    【解决方案3】:

    我不知道您是如何准确绘制像素的,但您达到的这个限制可能是因为您传输的数据量(效率低下?)。每 2-3 秒更新一个充满像素的屏幕一点也不难。虽然着色器让你更接近显卡,但它们永远不会让低效的方法变得快速,所以...

    为什么你的代码这么慢?

    1. 什么代码?你到底尝试了什么代码?您使用什么纹理,渲染到...?
    2. 速度慢吗?有多慢?您希望它有多快?
    3. 在视频内存中获得 1920x1080(?) 像素的速度有多快,您的硬件、驱动程序和操作系统是什么?

    我认为您需要编辑/重新发布,然后我们才能帮助您解决问题。仅仅因为它很慢,并不能保证着色器甚至会快一

    【讨论】:

      【解决方案4】:

      如果是静态显示相同图像的情况,则使用纹理或显示列表就足够了。但是当你想经常更新它时,着色器确实是最好的选择。着色器代码在 GPU 上执行并修改 GRAM 中的数据,因此您没有从 CPU 到 GPU 传输的瓶颈。下一个最好的东西可能是像素或帧缓冲区对象。缓冲区对象可让您通过 DMA 读取/写入 GRAM(无需通过 CPU),因此它们可以非常快。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多