打开GL着色器,具有2个纹理

时间:2017-01-04 16:45:25

标签: android opengl-es

我正在尝试在Android上使用Open GL ES进行一些实验。

我正在尝试编写一个着色器,它有两个指向2个纹理的统一变量。 一个包含当前帧,另一个包含在

之前在帧上绘制的纹理

它们是在java世界中创建的,如下所示:

texturenames = new int[2];
GLES20.glGenTextures(2, texturenames, 0);

// Bind texture to texturename
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[0]);
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[1]);

然后作为着色器的参数传递,如下所示:

int location = GLES20.glGetUniformLocation (ShaderTools.program, "currentTexture" );
GLES20.glUniform1i ( location, 0 );
location = GLES20.glGetUniformLocation (ShaderTools.program, "prevFrameTexture" );
GLES20.glUniform1i ( location, 1 );

这是片段着色器的内容:

precision mediump float;
varying vec2 v_TexCoordinate;
uniform sampler2D currentTexture;
uniform sampler2D prevFrameTexture;

main() {
    gl_FragColor   = (texture2D(currentTexture, v_TexCoordinate) +
                      texture2D(prevFrameTexture, v_TexCoordinate)) / 2;
}

我想要达到的目的是创造一种模糊效果,这是当前和前一帧平均值的结果。

是否有可能直接将prevFrameTexture更新为着色器代码?我没有找到任何办法做到这一点。

作为替代方案......我该如何解决这个问题?

我应该将currentTexture的内容复制到java世界中的prevFrameTexture吗?

我尝试将TEXTURE0TEXTURE1替换为onDrawFrame,但它不能作为glActiveTexture从一个交换到另一个,在内部不起作用回调

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。使用渲染到纹理(RTT)

我们可以将FBO作为纹理,这样你就可以制作两个FBO。 将RTT置于

以下的示例
glGenFramebuffers(1, &fbo[object_id]);
glBindFramebuffer(GL_FRAMEBUFFER, fbo[object_id]);

glGenRenderbuffers(1, &rboColor[object_id]);
glBindRenderbuffer(GL_RENDERBUFFER, rboColor[object_id]);

之后,按照下面的代码制作纹理

glGenTextures(1, &texture[texture_id].texture_id);
glBindTexture(GL_TEXTURE_2D, texture[texture_id].texture_id);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[texture_id].texture_id, 0);

一旦有RTT纹理,就可以通过渲染每个帧缓冲区来更新它们

https://github.com/sunglab/StarEngine/blob/master/renderer/StarFBO.cpp

void StarFBO :: createFBO(...)

https://github.com/sunglab/StarEngine/blob/master/renderer/StarTexture.cpp

void StarTexture :: createTEXTURE_RTT(...)