OpenGL es 3.1(android) glDeleteBuffers 导致绘图不正确

问题描述

我有 Java 类,可以将 3d 模型数据加载到 GPU,使用计算着色器计算法线,并将模型渲染到屏幕上。

它工作正常,直到我想从存储中加载其他网格。这个类有方法 cleanUp() 删除 vao、vbo、纹理......所以,我调用 cleanUp() 然后生成我的类的一个新实例。结果我有正确的网格,但法线不正确。如果我在 glDeleteBuffers 方法中不使用 cleanUp() 删除顶点 vbo,则重新加载后法线将正确计算。如果我尝试重新加载相同的网格,问题也是如此。

这是正常计算的着色器代码

    0: #version 310 es
    1: layout(local_size_x = 1) in;
    2: layout(std430) buffer;
    3: layout(binding = 0) buffer baseBuffer {
    4:     vec4 e[];
    5: } base;
    6: layout(binding = 1) buffer resultBuffer {
    7:     int e[];
    8: } result;
    9: layout(binding = 2) buffer indicesBuffer {
    10:     int e[];
    11: } indices;
    12: void main()
    13: {
    14: int arrPos = int(gl_GlobalInvocationID.x);
    15: vec3 norm = vec3(0.0);
    16: float mul = 1000000.0;
    17: norm = cross(base.e[indices.e[arrPos*3+2]].xyz-base.e[indices.e[arrPos*3]].xyz,base.e[indices.e[arrPos*3+1]].xyz-base.e[indices.e[arrPos*3]].xyz);
    18: atomicAdd(result.e[indices.e[arrPos*3]*4],int(norm.x*mul)); 
    19: atomicAdd(result.e[indices.e[arrPos*3]*4+1],int(norm.y*mul)); 
    20: atomicAdd(result.e[indices.e[arrPos*3]*4+2],int(norm.z*mul)); 
    21: norm = cross(base.e[indices.e[arrPos*3+0]].xyz-base.e[indices.e[arrPos*3+1]].xyz,base.e[indices.e[arrPos*3+2]].xyz-base.e[indices.e[arrPos*3+1]].xyz);
    22: atomicAdd(result.e[indices.e[arrPos*3+1]*4],int(norm.x*mul)); 
    23: atomicAdd(result.e[indices.e[arrPos*3+1]*4+1],int(norm.y*mul)); 
    24: atomicAdd(result.e[indices.e[arrPos*3+1]*4+2],int(norm.z*mul)); 
    25: norm = cross(base.e[indices.e[arrPos*3+1]].xyz-base.e[indices.e[arrPos*3+2]].xyz,base.e[indices.e[arrPos*3+0]].xyz-base.e[indices.e[arrPos*3+2]].xyz);
    26: atomicAdd(result.e[indices.e[arrPos*3+2]*4],int(norm.x*mul)); 
    27: atomicAdd(result.e[indices.e[arrPos*3+2]*4+1],int(norm.y*mul)); 
    28: atomicAdd(result.e[indices.e[arrPos*3+2]*4+2],int(norm.z*mul)); 
    29: } 

和其他着色器将数据转换为浮点数:

#version 310 es
1: layout(local_size_x = 1) in;
2: layout(std430) buffer;
3: layout(binding = 0) buffer srcBuffer {
4:     ivec4 e[];
5: } src;
6: layout(binding = 1) buffer resultBuffer {
7:     vec4 e[];
8: } result;
9: void main()
10: {
11: int arrPos = int(gl_GlobalInvocationID.x);
12: vec3 v= vec3(src.e[arrPos].xyz);
13: if (length(v)>0.0)
14: result.e[arrPos].xyz=normalize(v);
15: result.e[arrPos].w=1.0;
16: }

是同一个mesh,右图是重装后:

It is the same mesh,the right picture is after reloading

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)