首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带OpenGL的快速屏幕模糊化

带OpenGL的快速屏幕模糊化
EN

Stack Overflow用户
提问于 2012-09-21 05:36:42
回答 1查看 1.1K关注 0票数 2

游戏使用软件渲染,在内存中绘制一个全屏幕的(8位)图像。

使用OpenGL将图像放到屏幕上最快的方法是什么?

我尝试过的事情:

  • glDrawPixelsglPixelMap一起指定调色板,并让OpenGL执行调色板映射。表现极差(~5 FPS)。
  • 在软件中执行调色板映射(索引-> BGRX),然后使用glDrawPixels绘制。性能更好,但CPU的使用率仍然远远高于使用32位DirectDraw与相同的软件调色板映射。

我应该用某种纹理来代替吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-21 08:42:18

  • glDrawPixels与glPixelMap一起指定调色板,并让OpenGL执行调色板映射。表现极差(~5 FPS)。

这可不奇怪。glDrawPixels一开始不是很快,glPixelMap将在一个不太优化的代码页中在CPU上执行索引/调色板→RGB转换。

  • 在软件中执行调色板映射(索引-> BGRX),然后使用glDrawPixels绘制。

glDrawPixels是OpenGL中最慢的函数之一。这有两个主要原因:第一,它是一个不太优化的代码页,其次,它直接写入目标帧缓冲区,从而迫使管道在每次调用时同步。而且,在大多数GPU上,它没有任何缓存支持。

我建议您将索引图像放置到单通道纹理中,例如GL_R8 (用于OpenGL-3或更高版本)或GL_LUMINANCE8,以及您的调色板为一维RGB纹理,以便用作纹理坐标的索引能够查找颜色。使用纹理作为LUT是完全正常的。通过这种组合,您可以使用片段着色器进行原位调色板索引到颜色转换。

片段着色器看起来像这样

代码语言:javascript
复制
#version 330

uniform sampler2D image;
uniform sampler1D palette;

in vec2 texcoord;

void main()
{
    float index = tex2D(image, texcoord).r * 255.f; // 255 for a 8 bit palette
    gl_FragColor = texelFetch(palette, index, 0);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12524813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档