diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-02-03 20:29:38 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-02-03 20:29:55 +0300 |
commit | 8af5e2d246e3876d93e7fe3b288fcbabe7a843a8 (patch) | |
tree | b13150ab9fb94161d27c42041b9067c20b4bd873 /source/blender/draw | |
parent | c785a8e1661893f7d628ff641a1824418021e434 (diff) |
EEVEE: Fix more shader issues
Diffstat (limited to 'source/blender/draw')
5 files changed, 43 insertions, 11 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shader.cc b/source/blender/draw/engines/eevee/eevee_shader.cc index 792919cd8f6..14d022aabe0 100644 --- a/source/blender/draw/engines/eevee/eevee_shader.cc +++ b/source/blender/draw/engines/eevee/eevee_shader.cc @@ -272,6 +272,8 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu GPUCodegenOutput &codegen = *codegen_; ShaderCreateInfo &info = *reinterpret_cast<ShaderCreateInfo *>(codegen.create_info); + info.auto_resource_location(true); + std::stringstream global_vars; switch (geometry_type) { case MAT_GEOM_MESH: @@ -308,6 +310,22 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu break; } + const bool do_fragment_attrib_load = (geometry_type == MAT_GEOM_WORLD); + + if (do_fragment_attrib_load && !info.vertex_out_interfaces_.is_empty()) { + /* Codegen outputs only one interface. */ + const StageInterfaceInfo &iface = *info.vertex_out_interfaces_.first(); + /* Globals the attrib_load() can write to when it is in the fragment shader. */ + global_vars << "struct " << iface.name << " {\n"; + for (auto &inout : iface.inouts) { + global_vars << " " << inout.type << " " << inout.name << ";\n"; + } + global_vars << "};\n"; + global_vars << iface.name << " " << iface.instance_name << ";\n"; + + info.vertex_out_interfaces_.clear(); + } + std::stringstream attr_load; attr_load << "void attrib_load()\n"; attr_load << "{\n"; @@ -316,7 +334,7 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu std::stringstream vert_gen, frag_gen; - if (geometry_type == MAT_GEOM_WORLD) { + if (do_fragment_attrib_load) { frag_gen << global_vars.str() << attr_load.str(); } else { @@ -360,7 +378,7 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu frag_gen << ((codegen.thickness) ? codegen.thickness : "return 0.1;\n"); frag_gen << "}\n\n"; - info.fragment_source_generated = vert_gen.str(); + info.fragment_source_generated = frag_gen.str(); } /* Geometry Info. */ @@ -413,6 +431,7 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu } else { info.additional_info("eevee_surface_depth_simple"); + info.fragment_source_generated = ""; } break; case MAT_PIPE_DEFERRED: diff --git a/source/blender/draw/engines/eevee/shaders/eevee_lookdev_background_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_lookdev_background_frag.glsl index 0934aa3d2b4..b70b39a9467 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_lookdev_background_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_lookdev_background_frag.glsl @@ -7,6 +7,7 @@ */ #pragma BLENDER_REQUIRE(common_view_lib.glsl) +#pragma BLENDER_REQUIRE(common_math_lib.glsl) void main() { diff --git a/source/blender/draw/engines/eevee/shaders/eevee_nodetree_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/eevee_nodetree_eval_lib.glsl index 5bc3a1ecc0f..1df78ee62e3 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_nodetree_eval_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_nodetree_eval_lib.glsl @@ -95,3 +95,18 @@ void ntree_eval_weights() g_refraction_data.color.r += g_diffuse_data.color.r; } } + +/* Prototypes. */ +void attrib_load(); +vec3 nodetree_displacement(); +Closure nodetree_surface(); +Closure nodetree_volume(); +float nodetree_thickness(); + +#ifdef EEVEE_MATERIAL_STUBS +#define attrib_load() +#define nodetree_displacement() vec3(0) +#define nodetree_surface() CLOSURE_DEFAULT +#define nodetree_volume() CLOSURE_DEFAULT +#define nodetree_thickness() 0.1 +#endif diff --git a/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl index 25b47b5501e..70fe3af6832 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_subsurface_eval_frag.glsl @@ -15,7 +15,6 @@ #pragma BLENDER_REQUIRE(common_math_geom_lib.glsl) #pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) #pragma BLENDER_REQUIRE(eevee_gbuffer_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_closure_lib.glsl) vec3 burley_setup(vec3 radius, vec3 albedo) { diff --git a/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh b/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh index 942ed0b7c55..01a20bc4b1e 100644 --- a/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh +++ b/source/blender/draw/engines/eevee/shaders/infos/eevee_material_info.hh @@ -39,11 +39,13 @@ GPU_SHADER_CREATE_INFO(eevee_surface_hair) GPU_SHADER_CREATE_INFO(eevee_surface_lookdev) .vertex_in(0, Type::VEC3, "pos") .vertex_in(1, Type::VEC3, "nor") - .vertex_source("eevee_surface_lookdev_vert.glsl"); + .vertex_source("eevee_surface_lookdev_vert.glsl") + .additional_info("draw_mesh", "draw_resource_id_varying"); GPU_SHADER_CREATE_INFO(eevee_surface_world) .builtins(BuiltinBits::VERTEX_ID) - .vertex_source("eevee_surface_world_vert.glsl"); + .vertex_source("eevee_surface_world_vert.glsl") + .additional_info("draw_modelmat", "draw_resource_id_varying"); /** \} */ @@ -121,6 +123,7 @@ GPU_SHADER_CREATE_INFO(eevee_surface_background) * \{ */ GPU_SHADER_CREATE_INFO(eevee_background_lookdev) + .do_static_compilation(true) .additional_info("eevee_shared") .uniform_buf(0, "LightProbeInfoData", "probes_buf") .sampler(0, ImageType::FLOAT_CUBE_ARRAY, "lightprobe_cube_tx") @@ -162,12 +165,7 @@ GPU_SHADER_CREATE_INFO(eevee_volume_deferred) #ifdef DEBUG /* Stub functions defined by the material evaluation. */ -GPU_SHADER_CREATE_INFO(eevee_material_stub) - .define("attrib_load()") - .define("nodetree_displacement()", "vec3(0)") - .define("nodetree_surface()", "CLOSURE_DEFAULT") - .define("nodetree_volume()", "CLOSURE_DEFAULT") - .define("nodetree_thickness()", "0.1"); +GPU_SHADER_CREATE_INFO(eevee_material_stub).define("EEVEE_MATERIAL_STUBS"); # define EEVEE_MAT_FINAL_VARIATION(name, ...) \ GPU_SHADER_CREATE_INFO(name) \ |