0

我已将我的显示圈分为 16 段。我需要更新每个片段,读取随机生成的颜色矢量。我圈子的每一段都是 22.5,即 100 * 360 圈 = 2250 像素。当我搜索我将使用的函数是 glDrawPixels()。不过,我还不确定。你能给我一个示例代码来了解我如何生成我的颜色向量并使用这个向量更新我的圆段 2250 像素。此外,我不知道从哪里开始更新片段,它是真实的还是将被更新为纹理!

我也使用了这段代码,但给出了分段错误:

void GlWidget::displayColors()
{
    //Create some nice colours (3 floats per pixel) from data -10..+10
    int size = 2250;
    float* pixels = new float[size*3];

      for(int i=0;i<size;i++) {
          pixels[0] = 1;
                   pixels[1] = 1;
                             pixels[2] = 1;
      }

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      glDrawPixels(width(),height(),GL_RGB,GL_FLOAT,pixels);

    //  glutSwapBuffers();
}
4

2 回答 2

0

绘制 100 个圆圈几乎不会对 GPU 征税。听起来这是一个过早的优化。我强烈建议您在尝试执行您所描述的操作时使您的代码更加复杂之前进行适当的性能分析。

听起来您正试图通过仅渲染已更改的显示部分来优化绘图。这是 GUI 系统中缓冲区支持的显示的常见优化方法。但是,在使用 OpenGL 进行渲染时,这不是常态。通常你会为每一帧渲染整个场景。

此外,glReadPixels()是一项非常昂贵的操作。它基本上会停止渲染管道并将渲染缓冲区从 GPU 读回主内存,这相对较慢。这几乎肯定不是你想要做的。

如果你真的需要优化绘图,你可以将你的绘图缓存到一个纹理中,然后每帧渲染一个四边形的纹理。但首先,确保它真的值得付出额外的努力和复杂性。

有一些关于 OpenGL 和性能分析的好书和在线资源。在尝试为自己节省一些时间之前,绝对值得做一些研究以节省一些时间。:)

于 2013-06-09T13:02:23.097 回答
0

很难理解您要做什么,但我会提供一般性建议……</p>

在大多数平台上,OpenGL 是硬件加速的,并且比简单地将像素块传输到显示内存要快得多,因此几乎不需要渲染部分屏幕。有极少数例外,但只有在优化 OpenGL 管道无法解决的性能问题时才应考虑这样做。

于 2013-06-09T11:32:16.853 回答