glAccum(模糊效果)使用一个显卡而不是另一个

时间:2011-12-05 14:28:51

标签: c++ opengl

我正试图在我的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;
}

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

2 个答案:

答案 0 :(得分:3)

只是一个建议,但您是否尝试使用帧缓冲对象(FBO)而不是累积缓冲区? FBO得到了更好的支持。

大多数cosumer级GPU不支持累积缓冲区。您的集成GPU可能是英特尔GPU(非常可能)。如果那是你正在研发的Linux机器,那么你将陷入Mesa软件的后备。并且fglrx根本不会给你积累缓冲。

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

  1. 将纹理A绑定为FBO目标
  2. 渲染场景
  3. 将纹理B绑定为FBO目标
  4. 使用抖动渲染场景
    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)升
    6. 绘制覆盖场景的纹理四边形
  5. 交换纹理A<> B
  6. 重复步骤3到6次。
  7. 相反,od积累模糊使用着色器实现矢量模糊,效率更高。

答案 1 :(得分:2)

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

此外,this question似乎表明许多ATi卡缺少累积缓冲区。