GLSL对非纹理矩形的模糊效果

Posted

技术标签:

【中文标题】GLSL对非纹理矩形的模糊效果【英文标题】:GLSL blur effect on non textured rect 【发布时间】:2021-08-31 00:51:13 【问题描述】:

我正在尝试使用 glsl 着色器进行模糊处理。 我在互联网上寻找过它,但只找到了带有纹理输入的片段着色器。 如果我想模糊没有纹理的东西怎么办?我该怎么做?

应该是这样的:

【问题讨论】:

您能更具体地了解想要的效果吗?我的图片会有所帮助。 @RobinCirex 渲染到文本或在第一遍中使用glReadPixels,然后在第二遍中使用从第一遍获得的纹理对其进行模糊 @RobinCirex 您的图像在哪里/如何定位/存储? @RobinCirex 嗯? “模糊”是一种应用于图像的操作。实际上,您只是在上面的问题中附加了一个示例图像。该图像必须存储在系统内存中的某个位置——我的问题是在哪里。如果它不在纹理中,是否在帧缓冲区中?系统内存?文件? @RobinCirex 参见OpenGL Scale Single Pixel Line 2 pass 渲染示例,如果你想要速度并且有能力使用FBO and render to texture 来代替glReadPixels... 【参考方案1】:

着色器无法直接从帧缓冲区读取。纹理是从着色器中读取图像的主要方式(还有SSBO,但我不建议在这里使用它)。

因此,简而言之,“如何在没有纹理的情况下模糊图像”的答案是:创建纹理!您可以使用glCopyTextureSubImage2D 将图像从帧缓冲区复制到纹理;或者,更好的是,从一开始就渲染到由纹理支持的off-screen FBO。

编辑:从当前帧缓冲区复制到纹理的示例(在 C 中):

GLuint tex;
glCreateTextures(GL_TEXTURE_2D, 1, &tex);
glTextureStorage2D(tex, 1 /*levels*/, GL_SRGB8_ALPHA8, width, height);
glCopyTextureSubImage2D(tex, 0, 0, 0, 0, 0, width, height);
// tex now contains the content of framebuffer

【讨论】:

你能举例说明如何使用 glCopyTexSubImage2D 和存储数据吗?因为它不返回任何东西。顺便说一句,我正在用 Java 做这个,之前可能应该提到过。

以上是关于GLSL对非纹理矩形的模糊效果的主要内容,如果未能解决你的问题,请参考以下文章

全屏模糊 GLSL 显示对角线(OpenGL 核心)

GLSL 径向模糊的奇怪问题

OpenGL:只模糊纹理的一部分;可以使用顶点着色器加速吗?

SpriteKit中的磨砂玻璃效果?

模糊边缘的着色器,或如何绘制光线

QtQuick2:将 GLSL 着色器/图形效果应用于窗口元素?