我试图在我的 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 进行累积模糊非常简单:您需要两个纹理(一个渲染目标和一个累积纹理),这会改变它们的功能:
- 将纹理 A 绑定(bind)为 FBO 目标
- 渲染场景
- 将纹理 B 绑定(bind)为 FBO 目标
- 渲染带有抖动的场景
-
- 绑定(bind)纹理A作为采样源
- 启用混合,glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- 设置调制纹理环境或着色器
- glColor4f(1., 1., 1., 1./N);
- glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE)l
- 绘制覆盖场景的纹理四边形
- 交换纹理 A<>B
- 重复步骤 3 到 6 N 次。
或者使用实现 vector 模糊的着色器来代替累积模糊,效率要高得多。
关于c++ - glAccum(模糊效果)适用于一张显卡,但不适用于另一张显卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8386797/