问题描述
我有 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,右图是重装后:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)