diff options
Diffstat (limited to 'source/blender/gpu/shaders')
8 files changed, 52 insertions, 9 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl index 81e0965fad3..b5036b51d9d 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl @@ -61,11 +61,27 @@ vec2 do_widget(void) const vec2 ofs = vec2(0.5, -0.5); lineWidth = abs(rect.x - recti.x); vec2 emboss_ofs = vec2(0.0, -lineWidth); - vec2 v_pos[4] = vec2[4](rect.xz + emboss_ofs + ofs.yy, - rect.xw + ofs.yx, - rect.yz + emboss_ofs + ofs.xy, - rect.yw + ofs.xx); - vec2 pos = v_pos[gl_VertexID]; + + vec2 pos; + switch (gl_VertexID) { + default: + case 0: { + pos = rect.xz + emboss_ofs + ofs.yy; + break; + } + case 1: { + pos = rect.xw + ofs.yx; + break; + } + case 2: { + pos = rect.yz + emboss_ofs + ofs.xy; + break; + } + case 3: { + pos = rect.yw + ofs.xx; + break; + } + } uvInterp = pos - rect.xz; outRectSize = rect.yw - rect.xz; diff --git a/source/blender/gpu/shaders/gpu_shader_text_frag.glsl b/source/blender/gpu/shaders/gpu_shader_text_frag.glsl index d85884e0a25..2568cd74445 100644 --- a/source/blender/gpu/shaders/gpu_shader_text_frag.glsl +++ b/source/blender/gpu/shaders/gpu_shader_text_frag.glsl @@ -7,7 +7,7 @@ flat in int interp_size; out vec4 fragColor; -uniform sampler1DArray glyph; +uniform sampler2D glyph; const vec2 offsets4[4] = vec2[4]( vec2(-0.5, 0.5), vec2(0.5, 0.5), vec2(-0.5, -0.5), vec2(-0.5, -0.5)); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_geometry.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_geometry.glsl index 4db27c3049d..a14ff5021bf 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_geometry.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_geometry.glsl @@ -37,8 +37,13 @@ void node_geometry(vec3 I, normal = (toworld * vec4(N, 0.0)).xyz; true_normal = normal; # endif + +# ifdef HAIR_SHADER + tangent = -hairTangent; +# else tangent_orco_z(orco, orco); node_tangent(N, orco, objmat, tangent); +# endif parametric = vec3(barycentric, 0.0); backfacing = (gl_FrontFacing) ? 0.0 : 1.0; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 2e0515e324e..d77259638fd 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -55,6 +55,7 @@ void node_bsdf_principled(vec4 base_color, float specular_weight = (1.0 - transmission); clearcoat = max(clearcoat, 0.0); transmission_roughness = 1.0 - (1.0 - roughness) * (1.0 - transmission_roughness); + specular = max(0.0, specular); CLOSURE_VARS_DECLARE_4(Diffuse, Glossy, Glossy, Refraction); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl index 5a68f802659..5129bf71903 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_subsurface_scattering.glsl @@ -23,8 +23,8 @@ void node_subsurface_scattering(vec4 color, /* Not perfect for texture_blur values between 0.0 and 1.0. * Interpolate between separated color and color applied on irradiance. */ float one_minus_texture_blur = 1.0 - texture_blur; - vec3 sss_albedo = color.rgb * texture_blur + one_minus_texture_blur; - vec3 radiance_tint = color.rgb * one_minus_texture_blur + texture_blur; + vec3 sss_albedo = color.rgb * one_minus_texture_blur + texture_blur; + vec3 radiance_tint = color.rgb * texture_blur + one_minus_texture_blur; /* Consider output radiance as irradiance. */ out_Diffuse_0.radiance *= radiance_tint; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_tex_noise.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_tex_noise.glsl index d8d9ecdf287..5745f11ede4 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_tex_noise.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_tex_noise.glsl @@ -2,7 +2,7 @@ * coordinates to act as a seed since the noise functions don't have seed values. * A seed value is needed for generating distortion textures and color outputs. * The offset's components are in the range [100, 200], not too high to cause - * bad precision and not to small to be noticeable. We use float seed because + * bad precision and not too small to be noticeable. We use float seed because * OSL only support float hashes. */ diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl index 60ed098beb3..4ad5d4232de 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl @@ -150,3 +150,9 @@ void vector_math_faceforward( { outVector = faceforward(a, b, c); } + +void vector_math_multiply_add( + vec3 a, vec3 b, vec3 c, float scale, out vec3 outVector, out float outValue) +{ + outVector = a * b + c; +} diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_wavelength.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_wavelength.glsl new file mode 100644 index 00000000000..2c5d38eabbe --- /dev/null +++ b/source/blender/gpu/shaders/material/gpu_shader_material_wavelength.glsl @@ -0,0 +1,15 @@ +void node_wavelength(float wavelength, + sampler1DArray spectrummap, + float layer, + vec3 xyz_to_r, + vec3 xyz_to_g, + vec3 xyz_to_b, + out vec4 color) +{ + mat3 xyz_to_rgb = mat3(xyz_to_r, xyz_to_g, xyz_to_b); + float t = (wavelength - 380.0) / (780.0 - 380.0); + vec3 xyz = texture(spectrummap, vec2(t, layer)).rgb; + vec3 rgb = xyz * xyz_to_rgb; + rgb *= 1.0 / 2.52; /* Empirical scale from lg to make all comps <= 1. */ + color = vec4(clamp(rgb, 0.0, 1.0), 1.0); +} |