diff options
Diffstat (limited to 'source/blender/gpu')
6 files changed, 33 insertions, 5 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 2ff72266a64..f1ffd7827b8 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -275,6 +275,7 @@ data_to_c_simple(shaders/material/gpu_shader_material_anisotropic.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_attribute.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_background.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_bevel.glsl SRC) +data_to_c_simple(shaders/material/gpu_shader_material_wavelength.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_blackbody.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_bright_contrast.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_bump.glsl SRC) diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c index 175facc0a8d..3c216c1a991 100644 --- a/source/blender/gpu/intern/gpu_material_library.c +++ b/source/blender/gpu/intern/gpu_material_library.c @@ -47,6 +47,7 @@ extern char datatoc_gpu_shader_material_anisotropic_glsl[]; extern char datatoc_gpu_shader_material_attribute_glsl[]; extern char datatoc_gpu_shader_material_background_glsl[]; extern char datatoc_gpu_shader_material_bevel_glsl[]; +extern char datatoc_gpu_shader_material_wavelength_glsl[]; extern char datatoc_gpu_shader_material_blackbody_glsl[]; extern char datatoc_gpu_shader_material_bright_contrast_glsl[]; extern char datatoc_gpu_shader_material_bump_glsl[]; @@ -191,6 +192,11 @@ static GPUMaterialLibrary gpu_shader_material_bevel_library = { .dependencies = {NULL}, }; +static GPUMaterialLibrary gpu_shader_material_wavelength_library = { + .code = datatoc_gpu_shader_material_wavelength_glsl, + .dependencies = {NULL}, +}; + static GPUMaterialLibrary gpu_shader_material_blackbody_library = { .code = datatoc_gpu_shader_material_blackbody_glsl, .dependencies = {NULL}, @@ -593,6 +599,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = { &gpu_shader_material_attribute_library, &gpu_shader_material_background_library, &gpu_shader_material_bevel_library, + &gpu_shader_material_wavelength_library, &gpu_shader_material_blackbody_library, &gpu_shader_material_bright_contrast_library, &gpu_shader_material_bump_library, diff --git a/source/blender/gpu/opengl/gl_backend.cc b/source/blender/gpu/opengl/gl_backend.cc index e7d67be6d0e..31b6549fc3b 100644 --- a/source/blender/gpu/opengl/gl_backend.cc +++ b/source/blender/gpu/opengl/gl_backend.cc @@ -293,9 +293,9 @@ static void detect_workarounds() strstr(renderer, " RX 560 ") || strstr(renderer, " RX 560X ") || strstr(renderer, " RX 570 ") || strstr(renderer, " RX 580 ") || strstr(renderer, " RX 580X ") || strstr(renderer, " RX 590 ") || - strstr(renderer, " RX550/550 ") || strstr(renderer, " (TM) 520 ") || - strstr(renderer, " (TM) 530 ") || strstr(renderer, " R5 ") || strstr(renderer, " R7 ") || - strstr(renderer, " R9 ")) { + strstr(renderer, " RX550/550 ") || strstr(renderer, "(TM) 520 ") || + strstr(renderer, "(TM) 530 ") || strstr(renderer, "(TM) 535 ") || + strstr(renderer, " R5 ") || strstr(renderer, " R7 ") || strstr(renderer, " R9 ")) { GCaps.use_hq_normals_workaround = true; } } 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_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_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); +} |