gpt4 book ai didi

android - 如何在 openGL ES 2.0 中执行 2 次模糊效果

转载 作者:搜寻专家 更新时间:2023-11-01 08:46:06 25 4
gpt4 key购买 nike

为了创建模糊效果,理论上说要创建 2 个顶点着色器,一个用于水平 channel ,第二个用于垂直 channel 。然后是一个用于实际采样的 fragment 着色器。

我的问题是,如何实际执行 2 个顶点着色器?我是否需要渲染,然后通过 glReadPixels 取回像素,然后再次渲染?

我的环境是安卓,OpenGL ES 2.0

谢谢

最佳答案

您可以将第一遍渲染到 FBO,然后在将第二遍渲染到默认帧缓冲区时使用生成的纹理。

如果您要模糊的图像位于名称为 inputTexId 的纹理中,以下是代码外观的概述。您没有指定是使用 C++ 还是 Java。下面使用 C++ 绑定(bind),但在 Java 中看起来非常相似。

一次,在设置过程中,您创建了一个 FBO 和一个纹理,用于包含第一次渲染过程的结果:

GLuint pass1TexId = 0;
glGenTextures(1, &pass1TexId);
glBindTexture(GL_TEXTURE_2D, pass1TexId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
GL_RGB, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, pass1TexId, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

每次你想应用模糊滤镜时,你都使用这个 FBO 作为第一个渲染 channel 的渲染目标,并将你的原始图像作为输入:

glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glBindTexture(GL_TEXTURE_2D, inputTexId);
// Set up shaders and state for first blur pass, and render.

然后对于第二遍,您渲染到默认的帧缓冲区,并使用第一遍生成的纹理作为输入:

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, pass1TexId);
// Set up shaders and state for second blur pass, and render.

关于android - 如何在 openGL ES 2.0 中执行 2 次模糊效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28137625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com