This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/gpu/shaders/gpu_shader_codegen_lib.glsl
Jeroen Bakker 6a88f83d67 Hair Info Length Attribute
Goal is to add the length attribute to the Hair Info node, for better control over color gradients or similar along the hair.

Reviewed By: #eevee_viewport, brecht

Differential Revision: https://developer.blender.org/D10481
2021-09-24 07:44:22 +02:00

98 lines
2.5 KiB
GLSL

vec3 calc_barycentric_distances(vec3 pos0, vec3 pos1, vec3 pos2)
{
vec3 edge21 = pos2 - pos1;
vec3 edge10 = pos1 - pos0;
vec3 edge02 = pos0 - pos2;
vec3 d21 = normalize(edge21);
vec3 d10 = normalize(edge10);
vec3 d02 = normalize(edge02);
vec3 dists;
float d = dot(d21, edge02);
dists.x = sqrt(dot(edge02, edge02) - d * d);
d = dot(d02, edge10);
dists.y = sqrt(dot(edge10, edge10) - d * d);
d = dot(d10, edge21);
dists.z = sqrt(dot(edge21, edge21) - d * d);
return dists;
}
vec2 calc_barycentric_co(int vertid)
{
vec2 bary;
bary.x = float((vertid % 3) == 0);
bary.y = float((vertid % 3) == 1);
return bary;
}
#ifdef HAIR_SHADER
/* Hairs uv and col attributes are passed by bufferTextures. */
# define DEFINE_ATTR(type, attr) uniform samplerBuffer attr
# define GET_ATTR(type, attr) hair_get_customdata_##type(attr)
# define barycentric_get() hair_get_barycentric()
# define barycentric_resolve(bary) hair_resolve_barycentric(bary)
vec3 orco_get(vec3 local_pos, mat4 modelmatinv, vec4 orco_madd[2], const samplerBuffer orco_samp)
{
/* TODO: fix ORCO with modifiers. */
vec3 orco = (modelmatinv * vec4(local_pos, 1.0)).xyz;
return orco_madd[0].xyz + orco * orco_madd[1].xyz;
}
float hair_len_get(int id, const samplerBuffer len)
{
return texelFetch(len, id).x;
}
vec4 tangent_get(const samplerBuffer attr, mat3 normalmat)
{
/* Unsupported */
return vec4(0.0);
}
#else /* MESH_SHADER */
# define DEFINE_ATTR(type, attr) in type attr
# define GET_ATTR(type, attr) attr
/* Calculated in geom shader later with calc_barycentric_co. */
# define barycentric_get() vec2(0)
# define barycentric_resolve(bary) bary
vec3 orco_get(vec3 local_pos, mat4 modelmatinv, vec4 orco_madd[2], vec4 orco)
{
/* If the object does not have any deformation, the orco layer calculation is done on the fly
* using the orco_madd factors.
* We know when there is no orco layer when orco.w is 1.0 because it uses the generic vertex
* attrib (which is [0,0,0,1]). */
if (orco.w == 0.0) {
return orco.xyz * 0.5 + 0.5;
}
else {
return orco_madd[0].xyz + local_pos * orco_madd[1].xyz;
}
}
float hair_len_get(int id, const float len)
{
return len;
}
vec4 tangent_get(vec4 attr, mat3 normalmat)
{
vec4 tangent;
tangent.xyz = normalmat * attr.xyz;
tangent.w = attr.w;
float len_sqr = dot(tangent.xyz, tangent.xyz);
/* Normalize only if vector is not null. */
if (len_sqr > 0.0) {
tangent.xyz *= inversesqrt(len_sqr);
}
return tangent;
}
#endif