skeleton.glsl 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #[compute]
  2. #version 450
  3. VERSION_DEFINES
  4. layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
  5. layout(set = 0, binding = 1, std430) buffer restrict writeonly DstVertexData {
  6. uint data[];
  7. }
  8. dst_vertices;
  9. layout(set = 0, binding = 2, std430) buffer restrict readonly BlendShapeWeights {
  10. float data[];
  11. }
  12. blend_shape_weights;
  13. layout(set = 1, binding = 0, std430) buffer restrict readonly SrcVertexData {
  14. uint data[];
  15. }
  16. src_vertices;
  17. layout(set = 1, binding = 1, std430) buffer restrict readonly BoneWeightData {
  18. uint data[];
  19. }
  20. src_bone_weights;
  21. layout(set = 1, binding = 2, std430) buffer restrict readonly BlendShapeData {
  22. uint data[];
  23. }
  24. src_blend_shapes;
  25. layout(set = 2, binding = 0, std430) buffer restrict readonly SkeletonData {
  26. vec4 data[];
  27. }
  28. bone_transforms;
  29. layout(push_constant, binding = 0, std430) uniform Params {
  30. bool has_normal;
  31. bool has_tangent;
  32. bool has_skeleton;
  33. bool has_blend_shape;
  34. uint vertex_count;
  35. uint vertex_stride;
  36. uint skin_stride;
  37. uint skin_weight_offset;
  38. uint blend_shape_count;
  39. bool normalized_blend_shapes;
  40. uint pad0;
  41. uint pad1;
  42. }
  43. params;
  44. vec4 decode_abgr_2_10_10_10(uint base) {
  45. uvec4 abgr_2_10_10_10 = (uvec4(base) >> uvec4(0, 10, 20, 30)) & uvec4(0x3FF, 0x3FF, 0x3FF, 0x3);
  46. return vec4(abgr_2_10_10_10) / vec4(1023.0, 1023.0, 1023.0, 3.0) * 2.0 - 1.0;
  47. }
  48. uint encode_abgr_2_10_10_10(vec4 base) {
  49. uvec4 abgr_2_10_10_10 = uvec4(clamp(ivec4((base * 0.5 + 0.5) * vec4(1023.0, 1023.0, 1023.0, 3.0)), ivec4(0), ivec4(0x3FF, 0x3FF, 0x3FF, 0x3))) << uvec4(0, 10, 20, 30);
  50. return abgr_2_10_10_10.x | abgr_2_10_10_10.y | abgr_2_10_10_10.z | abgr_2_10_10_10.w;
  51. }
  52. void main() {
  53. uint index = gl_GlobalInvocationID.x;
  54. if (index >= params.vertex_count) {
  55. return;
  56. }
  57. uint src_offset = index * params.vertex_stride;
  58. #ifdef MODE_2D
  59. vec2 vertex = uintBitsToFloat(uvec2(src_vertices.data[src_offset + 0], src_vertices.data[src_offset + 1]));
  60. #else
  61. vec3 vertex;
  62. vec3 normal;
  63. vec4 tangent;
  64. vertex = uintBitsToFloat(uvec3(src_vertices.data[src_offset + 0], src_vertices.data[src_offset + 1], src_vertices.data[src_offset + 2]));
  65. src_offset += 3;
  66. if (params.has_normal) {
  67. normal = decode_abgr_2_10_10_10(src_vertices.data[src_offset]).rgb;
  68. src_offset++;
  69. }
  70. if (params.has_tangent) {
  71. tangent = decode_abgr_2_10_10_10(src_vertices.data[src_offset]);
  72. }
  73. if (params.has_blend_shape) {
  74. float blend_total = 0.0;
  75. vec3 blend_vertex = vec3(0.0);
  76. vec3 blend_normal = vec3(0.0);
  77. vec3 blend_tangent = vec3(0.0);
  78. for (uint i = 0; i < params.blend_shape_count; i++) {
  79. float w = blend_shape_weights.data[i];
  80. if (abs(w) > 0.0001) {
  81. uint base_offset = (params.vertex_count * i + index) * params.vertex_stride;
  82. blend_vertex += uintBitsToFloat(uvec3(src_blend_shapes.data[base_offset + 0], src_blend_shapes.data[base_offset + 1], src_blend_shapes.data[base_offset + 2])) * w;
  83. base_offset += 3;
  84. if (params.has_normal) {
  85. blend_normal += decode_abgr_2_10_10_10(src_blend_shapes.data[base_offset]).rgb * w;
  86. base_offset++;
  87. }
  88. if (params.has_tangent) {
  89. blend_tangent += decode_abgr_2_10_10_10(src_blend_shapes.data[base_offset]).rgb;
  90. }
  91. blend_total += w;
  92. }
  93. }
  94. if (params.normalized_blend_shapes) {
  95. vertex = (1.0 - blend_total) * vertex;
  96. normal = (1.0 - blend_total) * normal;
  97. tangent.rgb = (1.0 - blend_total) * tangent.rgb;
  98. }
  99. vertex += blend_vertex;
  100. normal += normalize(normal + blend_normal);
  101. tangent.rgb += normalize(tangent.rgb + blend_tangent);
  102. }
  103. if (params.has_skeleton) {
  104. uint skin_offset = params.skin_stride * index;
  105. uvec2 bones = uvec2(src_bone_weights.data[skin_offset + 0], src_bone_weights.data[skin_offset + 1]);
  106. uvec2 bones_01 = uvec2(bones.x & 0xFFFF, bones.x >> 16) * 3; //pre-add xform offset
  107. uvec2 bones_23 = uvec2(bones.y & 0xFFFF, bones.y >> 16) * 3;
  108. skin_offset += params.skin_weight_offset;
  109. uvec2 weights = uvec2(src_bone_weights.data[skin_offset + 0], src_bone_weights.data[skin_offset + 1]);
  110. vec2 weights_01 = unpackUnorm2x16(weights.x);
  111. vec2 weights_23 = unpackUnorm2x16(weights.y);
  112. mat4 m = mat4(bone_transforms.data[bones_01.x], bone_transforms.data[bones_01.x + 1], bone_transforms.data[bones_01.x + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_01.x;
  113. m += mat4(bone_transforms.data[bones_01.y], bone_transforms.data[bones_01.y + 1], bone_transforms.data[bones_01.y + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_01.y;
  114. m += mat4(bone_transforms.data[bones_23.x], bone_transforms.data[bones_23.x + 1], bone_transforms.data[bones_23.x + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_23.x;
  115. m += mat4(bone_transforms.data[bones_23.y], bone_transforms.data[bones_23.y + 1], bone_transforms.data[bones_23.y + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_23.y;
  116. if (params.skin_weight_offset == 4) {
  117. //using 8 bones/weights
  118. skin_offset = params.skin_stride * index + 2;
  119. bones = uvec2(src_bone_weights.data[skin_offset + 0], src_bone_weights.data[skin_offset + 1]);
  120. bones_01 = uvec2(bones.x & 0xFFFF, bones.x >> 16) * 3; //pre-add xform offset
  121. bones_23 = uvec2(bones.y & 0xFFFF, bones.y >> 16) * 3;
  122. skin_offset += params.skin_weight_offset;
  123. weights = uvec2(src_bone_weights.data[skin_offset + 0], src_bone_weights.data[skin_offset + 1]);
  124. weights_01 = unpackUnorm2x16(weights.x);
  125. weights_23 = unpackUnorm2x16(weights.y);
  126. m += mat4(bone_transforms.data[bones_01.x], bone_transforms.data[bones_01.x + 1], bone_transforms.data[bones_01.x + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_01.x;
  127. m += mat4(bone_transforms.data[bones_01.y], bone_transforms.data[bones_01.y + 1], bone_transforms.data[bones_01.y + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_01.y;
  128. m += mat4(bone_transforms.data[bones_23.x], bone_transforms.data[bones_23.x + 1], bone_transforms.data[bones_23.x + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_23.x;
  129. m += mat4(bone_transforms.data[bones_23.y], bone_transforms.data[bones_23.y + 1], bone_transforms.data[bones_23.y + 2], vec4(0.0, 0.0, 0.0, 1.0)) * weights_23.y;
  130. }
  131. //reverse order because its transposed
  132. vertex = (vec4(vertex, 1.0) * m).xyz;
  133. normal = normalize((vec4(normal, 0.0) * m).xyz);
  134. tangent.xyz = normalize((vec4(tangent.xyz, 0.0) * m).xyz);
  135. }
  136. uint dst_offset = index * params.vertex_stride;
  137. uvec3 uvertex = floatBitsToUint(vertex);
  138. dst_vertices.data[dst_offset + 0] = uvertex.x;
  139. dst_vertices.data[dst_offset + 1] = uvertex.y;
  140. dst_vertices.data[dst_offset + 2] = uvertex.z;
  141. dst_offset += 3;
  142. if (params.has_normal) {
  143. dst_vertices.data[dst_offset] = encode_abgr_2_10_10_10(vec4(normal, 0.0));
  144. dst_offset++;
  145. }
  146. if (params.has_tangent) {
  147. dst_vertices.data[dst_offset] = encode_abgr_2_10_10_10(tangent);
  148. }
  149. #endif
  150. }