opengl使用compute shader的生成纹理,解决残影的问题

在做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进行删除,这样能够保证渲染时都是用最新的纹理进行渲染的。

 

当然,方法都不是很好的方法,看看大家有没有更好的方法,留言之,多谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
OpenGL Compute ShaderOpenGL 4.3引入的一种新型Shader,它主要用于通用计算(GPGPU)任务而不是图形渲染。它可以在GPU上执行高度并行的计算任务,例如物理模拟、图像处理和机器学习等。Compute Shader与其他Shader不同之处在于它没有渲染管道的输入和输出,并且可以从CPU上下文中直接调用。它还可以读写各种类型的缓冲区和纹理,使其非常灵活和强大。 Compute Shader使用步骤如下: 1.创建Compute Shader对象:使用glCreateShader函数创建Compute Shader对象。 2.编译Compute Shader代码:使用glShaderSource和glCompileShader函数将Compute Shader代码编译为OpenGL可识别的二进制格式。 3.创建Compute Program对象:使用glCreateProgram函数创建Compute Program对象。 4.将Compute Shader附加到Compute Program对象上:使用glAttachShader函数将Compute Shader附加到Compute Program对象上。 5.链接Compute Program对象:使用glLinkProgram函数将Compute Program对象链接到OpenGL渲染管道。 6.使用Compute Shader使用glUseProgram函数激活Compute Program对象,并通过glDispatchCompute函数调用Compute Shader。 7.清理资源:使用glDeleteShader和glDeleteProgram函数删除Compute ShaderCompute Program对象。 下面是一个简单的Compute Shader示例代码: ```glsl #version 430 layout(local_size_x = 16, local_size_y = 16) in; layout(std430, binding = 0) buffer InputBuffer { float data[]; }; layout(std430, binding = 1) buffer OutputBuffer { float result[]; }; void main() { uint idx = gl_GlobalInvocationID.x + gl_GlobalInvocationID.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x; result[idx] = data[idx] * data[idx]; } ``` 这个Compute Shader使用输入缓冲区和输出缓冲区,对输入缓冲区的每个元素进行平方运算,并将结果存储在输出缓冲区中。在主函数中,使用gl_GlobalInvocationID获取全局线程ID,计算出要处理的输入元素的索引,并在输出缓冲区中存储计算结果。 最后,通过调用glDispatchCompute函数启动Compute Shader。该函数需要指定调度的工作组数量,以及每个工作组中线程的数量。在这个示例中,我们使用16x16的工作组,并将其应用于输入缓冲区的所有元素。 ```c++ glDispatchCompute(numGroupsX, numGroupsY, numGroupsZ); ``` 以上就是OpenGL Compute Shader的原理与使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XR风云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值