我正在尝试在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
吗?
我尝试将TEXTURE0
和TEXTURE1
替换为onDrawFrame
,但它不能作为glActiveTexture
从一个交换到另一个,在内部不起作用回调
答案 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(...)