避免显示离屏纹理
Avoid display of offscreen texture
我有一个 android 媒体播放器应用程序。我使用了附加到 FBO 的屏幕外纹理,该纹理使用着色器程序 1 并具有屏幕纹理
使用着色器程序 2.
为简单起见,假设我的 shader1 输出红色。 (R=1)。我的第二个着色器从第一个着色器读取 r 值并使绿色 = 1。
所以实际上我应该得到 r+g = yellow.
我的问题是,在第一瞬间,我看到红色屏幕(来自屏幕外纹理),然后突然变成黄色。在我的真实场景中,开始时一瞬间的红色是一个问题。
请问有办法解决吗?
函数OnSurfaceChanged:
// 1st texture:
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTexture1 = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexture1);
// 2nd texture
int[] textures2d = new int[1];
GLES20.glGenTextures(1, textures2d, 0);
mTexture2 = textures2d[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture2);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
width, height, 0, GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE, null);
// FBO
int handle2[] = { 0 };
GLES20.glGenFramebuffers(1, handle2, 0);
mFrameBufferHandle2 = handle2[0];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferHandle2);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,
GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D,
mTexture2, 0);
surface1 = new SurfaceTexture(mTexture1);
... pass it to mediaplayer
函数onDrawFrame :
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// Shader 1
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferHandle2);
GLES20.glViewport(0, 0, mViewportWidth, mViewportHeight);
glUseProgram(shader1);
.....
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexture1);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
// Shader 2
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glViewport(0, 0, mViewportWidth, mViewportHeight);
glUseProgram(shader2);
...
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture2);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
加
即可解决
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
在 GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
之后
我有一个 android 媒体播放器应用程序。我使用了附加到 FBO 的屏幕外纹理,该纹理使用着色器程序 1 并具有屏幕纹理 使用着色器程序 2.
为简单起见,假设我的 shader1 输出红色。 (R=1)。我的第二个着色器从第一个着色器读取 r 值并使绿色 = 1。 所以实际上我应该得到 r+g = yellow.
我的问题是,在第一瞬间,我看到红色屏幕(来自屏幕外纹理),然后突然变成黄色。在我的真实场景中,开始时一瞬间的红色是一个问题。 请问有办法解决吗?
函数OnSurfaceChanged:
// 1st texture:
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTexture1 = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexture1);
// 2nd texture
int[] textures2d = new int[1];
GLES20.glGenTextures(1, textures2d, 0);
mTexture2 = textures2d[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture2);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
width, height, 0, GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE, null);
// FBO
int handle2[] = { 0 };
GLES20.glGenFramebuffers(1, handle2, 0);
mFrameBufferHandle2 = handle2[0];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferHandle2);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,
GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D,
mTexture2, 0);
surface1 = new SurfaceTexture(mTexture1);
... pass it to mediaplayer
函数onDrawFrame :
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// Shader 1
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferHandle2);
GLES20.glViewport(0, 0, mViewportWidth, mViewportHeight);
glUseProgram(shader1);
.....
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexture1);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
// Shader 2
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glViewport(0, 0, mViewportWidth, mViewportHeight);
glUseProgram(shader2);
...
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture2);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
加
即可解决 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
在 GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
之后