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对非纹理矩形的模糊效果的主要内容,如果未能解决你的问题,请参考以下文章