Files
coven/modules/ufbx/examples/viewer/shaders/mesh.glsl

121 lines
2.8 KiB
GLSL

@ctype vec3 um_vec3
@ctype vec4 um_vec4
@ctype mat4 um_mat
@block vertex_shared
layout(binding=0) uniform mesh_vertex_ubo {
mat4 geometry_to_world;
mat4 normal_to_world;
mat4 world_to_clip;
vec4 blend_weights[16];
float f_num_blend_shapes;
};
layout(binding=0) uniform sampler2DArray blend_shapes;
vec3 evaluate_blend_shape(int vertex_index)
{
ivec2 coord = ivec2(vertex_index & (2048 - 1), vertex_index >> 11);
int num_blend_shapes = int(f_num_blend_shapes);
vec3 offset = vec3(0.0);
for (int i = 0; i < num_blend_shapes; i++) {
vec4 packed = blend_weights[i >> 2];
float weight = packed[i & 3];
offset += weight * texelFetch(blend_shapes, ivec3(coord, i), 0).xyz;
}
return offset;
}
@end
@vs static_vertex
@include_block vertex_shared
layout(location=0) in vec3 a_position;
layout(location=1) in vec3 a_normal;
layout(location=2) in vec2 a_uv;
layout(location=3) in float a_vertex_index;
out vec3 v_normal;
out vec2 v_uv;
void main()
{
vec3 local_pos = a_position;
local_pos += evaluate_blend_shape(int(a_vertex_index));
vec3 world_pos = (geometry_to_world * vec4(local_pos, 1.0)).xyz;
gl_Position = world_to_clip * vec4(world_pos, 1.0);
v_normal = normalize((normal_to_world * vec4(a_normal, 0.0)).xyz);
v_uv = a_uv;
}
@end
@vs skinned_vertex
@include_block vertex_shared
layout(binding=1) uniform skin_vertex_ubo {
mat4 bones[64];
};
layout(location=0) in vec3 a_position;
layout(location=1) in vec3 a_normal;
layout(location=2) in vec2 a_uv;
layout(location=3) in float a_vertex_index;
#if SOKOL_GLSL
layout(location=4) in vec4 a_bone_indices;
#else
layout(location=4) in ivec4 a_bone_indices;
#endif
layout(location=5) in vec4 a_bone_weights;
out vec3 v_normal;
out vec2 v_uv;
void main()
{
mat4 bind_to_world
= bones[int(a_bone_indices.x)] * a_bone_weights.x
+ bones[int(a_bone_indices.y)] * a_bone_weights.y
+ bones[int(a_bone_indices.z)] * a_bone_weights.z
+ bones[int(a_bone_indices.w)] * a_bone_weights.w;
vec3 local_pos = a_position;
local_pos += evaluate_blend_shape(int(a_vertex_index));
vec3 world_pos = (bind_to_world * vec4(local_pos, 1.0)).xyz;
vec3 world_normal = (bind_to_world * vec4(a_normal, 0.0)).xyz;
gl_Position = world_to_clip * vec4(world_pos, 1.0);
v_normal = normalize(world_normal);
v_uv = a_uv;
}
@end
@fs lit_pixel
in vec3 v_normal;
in vec2 v_uv;
out vec4 o_color;
void main()
{
float l = dot(v_normal, normalize(vec3(1.0, 1.0, 1.0)));
// HACK: We need to use UV here somehow so it doesn't get stripped..
// TODO: Implement textures
l += v_uv.x * 0.0001;
l = l * 0.5 + 0.5;
o_color = vec4(l, l, l, 1.0);
}
@end
@program static_lit static_vertex lit_pixel
@program skinned_lit skinned_vertex lit_pixel