glAccum(模糊效果)工作与一个显卡,但不是另一个
glAccum (blur effect) working with with one graphics card but not the other
我试图在我的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进行累积模糊很简单:你需要两个纹理(一个渲染目标和一个累积纹理),这改变了它们的功能:
- 将纹理A绑定为FBO目标 <
- 渲染场景/gh>
- 将纹理B绑定为FBO目标
- 用抖动渲染场景
- 绑定纹理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次。
或者使用实现矢量模糊的着色器来代替累积模糊,这要有效得多。
您应该检查是否从OpenGL获得任何错误代码。此外,您还可以读出缓冲区的精度,如果它为0,则表示缓冲区不可用。
此外,这个问题似乎表明许多ATi卡缺乏累积缓冲区。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 卡在测试'if':另一个代码的一部分
- 是否可以在另一个类的实例中显式调用对象的析构函数?
- ::P ostMessage 当我被选项卡切换到另一个程序时不起作用
- 不能从同一类的另一个构造函数调用具有所有默认参数的显式构造函数
- glAccum(模糊效果)工作与一个显卡,但不是另一个
- 在ubuntu上运行cuda -它是否需要一个本地设备驱动程序(使用nvidia显卡)
- 在另一个类的命名空间中声明一个类,而不进行显式嵌套声明
- 卡洛克覆盖了另一个变量的内存?
- 从另一个选项卡FLTK中开始的线程隐藏小部件