glAccum(模糊效果)工作与一个显卡,但不是另一个

glAccum (blur effect) working with with one graphics card but not the other

本文关键字:显卡 另一个 一个 模糊 工作 glAccum      更新时间:2023-10-16

我试图在我的OpenGL游戏中创建一个"模糊"效果,即在某些部分我启用以下代码和视觉模糊一点…

if(world->blur) {
    glAccum(GL_MULT, 0.85);
    glAccum(GL_ACCUM, 1- 0.85);
    glAccum(GL_RETURN, 1.0);
    glFlush();
}

当我使用笔记本电脑的集成芯片时,这通常会导致较低的帧率,但如果我启用ATI gpu,它会给我更快的性能,那么效果是不可见的…

我在游戏中使用固定时间时钟:

tickTime += dt;
if(tickTime >= 1/DESIRED_FRAME_RATE) {
    level->update(tickTime);
    world->update(tickTime);
    renderer->drawScene(tickTime);
    tickTime = 0;
}

是否有一些明显的原因发生这种情况?

只是一个建议,但是您是否想到使用帧缓冲对象(fbo)而不是累积缓冲区?fbo的支持要好得多。

大多数消费级GPU不支持累积缓冲区。您集成的GPU可能是英特尔GPU(很可能)。如果您使用的是Linux机器,那么您将陷入Mesa软件的备份。而且fglrx根本不会给你累积缓冲。

使用FBO进行累积模糊很简单:你需要两个纹理(一个渲染目标和一个累积纹理),这改变了它们的功能:

  1. 将纹理A绑定为FBO目标
  2. <
  3. 渲染场景/gh>
  4. 将纹理B绑定为FBO目标
  5. 用抖动渲染场景
    1. 绑定纹理A作为采样源
    2. 启用混合,glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    3. 设置调制纹理环境或着色器
    4. glColor4f(1。1。1。, 1./N);
    5. glDisable (GL_DEPTH_TEST);glDepthMask (GL_FALSE) l
    6. 绘制覆盖场景的纹理四边形
  6. 交换纹理A<>B
  7. 重复步骤3至6 N次。

或者使用实现矢量模糊的着色器来代替累积模糊,这要有效得多。

您应该检查是否从OpenGL获得任何错误代码。此外,您还可以读出缓冲区的精度,如果它为0,则表示缓冲区不可用。

此外,这个问题似乎表明许多ATi卡缺乏累积缓冲区。

相关文章: