繁体   English   中英

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

[英]OpenGL es 3.1(android) glDeleteBuffers causes incorrect drawings

I have Java class that loads 3d model data to gpu, computes normals with compute shader, and renders the model to the screen.

在我想从存储中加载其他网格之前,它工作正常。 这个 class 有方法cleanUp()删除 vao、vbo、纹理......所以,我调用cleanUp() ,然后生成我的 class 的新实例。 结果,我有正确的网格,但法线不正确。 如果我没有在cleanUp()方法中使用glDeleteBuffers删除顶点 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,右图是重装后的:

是同一个网格,右图是重装后的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM