diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/eevee_surface_hair_vert.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/eevee_surface_hair_vert.glsl | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_surface_hair_vert.glsl b/source/blender/draw/engines/eevee/shaders/eevee_surface_hair_vert.glsl new file mode 100644 index 00000000000..ed749b33463 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/eevee_surface_hair_vert.glsl @@ -0,0 +1,80 @@ + +#pragma BLENDER_REQUIRE(common_attribute_lib.glsl) +#pragma BLENDER_REQUIRE(common_hair_lib.glsl) +#pragma BLENDER_REQUIRE(common_math_lib.glsl) +#pragma BLENDER_REQUIRE(common_view_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_nodetree_eval_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_surface_lib.glsl) + +/* TODO(fclem) remove use of macro. use interface block instead. */ +RESOURCE_ID_VARYING + +/* Globals to feed the load functions. */ +vec3 T; + +void main(void) +{ + bool is_persp = (ProjectionMatrix[3][3] == 0.0); + hair_get_pos_tan_binor_time(is_persp, + ModelMatrixInverse, + ViewMatrixInverse[3].xyz, + ViewMatrixInverse[2].xyz, + interp.P, + T, + interp.hair_binormal, + interp.hair_time, + interp.hair_thickness, + interp.hair_time_width); + + interp.N = cross(T, interp.hair_binormal); + interp.hair_strand_id = hair_get_strand_id(); + interp.barycentric_coords = hair_get_barycentric(); + + PASS_RESOURCE_ID + attrib_load(); + + g_data = init_globals(); + interp.P += nodetree_displacement(); + + gl_Position = point_world_to_ndc(interp.P); +} + +#ifdef OBINFO_LIB +vec3 attr_load_orco(samplerBuffer cd_buf) +{ + vec3 P = hair_get_strand_pos(); + vec3 lP = transform_point(ModelMatrixInverse, P); + return OrcoTexCoFactors[0].xyz + lP * OrcoTexCoFactors[1].xyz; +} +#endif + +vec4 attr_load_tangent(samplerBuffer cd_buf) +{ + /* Not supported. */ + return vec4(0.0, 0.0, 0.0, 1.0); +} + +vec3 attr_load_uv(samplerBuffer cd_buf) +{ + return texelFetch(cd_buf, interp.hair_strand_id).rgb; +} + +vec4 attr_load_color(samplerBuffer cd_buf) +{ + return texelFetch(cd_buf, interp.hair_strand_id).rgba; +} + +vec4 attr_load_vec4(samplerBuffer cd_buf) +{ + return texelFetch(cd_buf, interp.hair_strand_id).rgba; +} + +vec3 attr_load_vec3(samplerBuffer cd_buf) +{ + return texelFetch(cd_buf, interp.hair_strand_id).rgb; +} + +vec2 attr_load_vec2(samplerBuffer cd_buf) +{ + return texelFetch(cd_buf, interp.hair_strand_id).rg; +} |