在做AR云渲染的项目中,经常会有残影出现,定位问题吧。
在我们项目中,使用到了compute shader来定制一些纹理的输出,每帧的写纹理可能没有覆盖纹理的每个像素,这样就造成了问题,下一帧的渲染这个纹理时,由于没有清理纹理缓存,造成残影的出现。
尝试使用glClearColor与glClear去做清理,清理不掉。
在看其他项目c/c++中,把这个纹理绑定到framebuffer上,在使用glClearColor与glClear去做清理,还是清理不掉。
最后想到2个比较粗暴简单的方法:
方法一:每次渲染,都强制用0进行赋值一次。代码中,我们纹理是GL_R32UI格式的,所以用int类型就行赋值。其他格式的原理一样。
private IntBuffer mEmptyBuffer;
int[] mEmptyData = new int[width * height];
mEmptyBuffer = ByteBuffer.allocateDirect(4 * mEmptyData.length)
.order(ByteOrder.nativeOrder()).asIntBuffer();
mEmptyBuffer.put(mEmptyData);
mEmptyBuffer.rewind();
GLES32.glBindTexture(GLES32.GL_TEXTURE_2D, mCsImageIDs[0]);
GLES32.glTexSubImage2D(GLES32.GL_TEXTURE_2D, 0, 0, 0, width, height, GLES32.GL_RED_INTEGER, GLES32.GL_UNSIGNED_INT, mEmptyBuffer);
GLES32.glBindTexture(GLES32.GL_TEXTURE_2D, 0);
方法二:
纹理ID每次渲染都重新生成,用完之后使用glDeleteTextures进行删除,这样能够保证渲染时都是用最新的纹理进行渲染的。
当然,方法都不是很好的方法,看看大家有没有更好的方法,留言之,多谢。