c++ - glAccum(模糊效果)适用于一张显卡,但不适用于另一张显卡

标签 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;
}

发生这种情况有什么明显的原因吗?

最佳答案

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

大多数消费级 GPU 不支持累积缓冲区。您的集成 GPU 可能是 Intel GPU(很可能)。如果您正在使用 Linux 机器,那么您将陷入 Mesa 软件后备状态。并且 fglrx 根本不会为您提供累积缓冲。

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

  1. 将纹理 A 绑定(bind)为 FBO 目标
  2. 渲染场景
  3. 将纹理 B 绑定(bind)为 FBO 目标
  4. 渲染带有抖动的场景
    1. 绑定(bind)纹理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. 绘制覆盖场景的纹理四边形
  5. 交换纹理 A<>B
  6. 重复步骤 3 到 6 N 次。

或者使用实现 vector 模糊的着色器来代替累积模糊,效率要高得多。

关于c++ - glAccum(模糊效果)适用于一张显卡,但不适用于另一张显卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8386797/

相关文章:

opengl - 大型 3D 场景流

opengl - 可扩展环境遮挡渲染问题

c++ - CUDA:减少算法

c++ - 为什么这种音频代码循环使用如此多的 CPU/内存?

c - C 中的 OpenGL 对象加载器

opengl - 为什么我的几何着色器变成 "overloaded"?

opengl - 如果我处理大量数据,OpenGL 会关心吗?

c++ - 用zlib提取一个gz文件内容并保存

如果类是虚拟继承的,C++ 内部会发生什么?

c++ - 如果 mutex::lock() 已被另一个线程锁定,则多久检查一次解锁状态?