diff options
author | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-05-03 23:45:27 +0300 |
---|---|---|
committer | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-05-03 23:50:04 +0300 |
commit | 281bcc1c1dd6b786bafa2712986885c44ed482a3 (patch) | |
tree | af2ec45d2d67fce7ee94086074c05d806722fc48 /source/blender/gpu | |
parent | 94205e1d029511b2ab714a53d84de8c50a70fb39 (diff) |
Fix T93179: geonodes UVs and Vertex colors do not work in EEVEE
Overwriting UV map or vertex color data in Geometry nodes will move the
layers to another CustomData channel, and as such, will make attribute
lookup fail from the UVMap and Vertex Color nodes in EEVEE as the
CustomDataType will also be modified (i.e. no longer `CD_MTFACE` or
`CD_MCOL`).
As discussed in T93179, the solution is to use `CD_PROP_AUTO_FROM_NAME`
so that the render engine is able to find the attributes. This also makes
EEVEE emulate Cycles behaviour in this regard. `attr_load_uv` and
`attr_load_color` are also removed in favor of the generic attribute
API in the various GLSL shaders.
Although `CD_PROP_AUTO_FROM_NAME` is now used even for UV maps, the
active UV map is still used in case the attribute name is empty, to
preserve the old behavior.
Differential Revision: https://developer.blender.org/D13730
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.cc | 8 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_node_graph.c | 12 | ||||
-rw-r--r-- | source/blender/gpu/shaders/material/gpu_shader_material_uv_map.glsl | 4 |
3 files changed, 2 insertions, 22 deletions
diff --git a/source/blender/gpu/intern/gpu_codegen.cc b/source/blender/gpu/intern/gpu_codegen.cc index 2e7c95974ab..b6b0825a993 100644 --- a/source/blender/gpu/intern/gpu_codegen.cc +++ b/source/blender/gpu/intern/gpu_codegen.cc @@ -326,14 +326,6 @@ void GPUCodegen::generate_attribs() iface_type = input_type = GPU_VEC4; load_ss << " = attr_load_tangent(" << attr_name << ");\n"; break; - case CD_MTFACE: - iface_type = input_type = GPU_VEC3; - load_ss << " = attr_load_uv(" << attr_name << ");\n"; - break; - case CD_MCOL: - iface_type = input_type = GPU_VEC4; - load_ss << " = attr_load_color(" << attr_name << ");\n"; - break; default: iface_type = input_type = GPU_VEC4; load_ss << " = attr_load_" << input_type << "(" << attr_name << ");\n"; diff --git a/source/blender/gpu/intern/gpu_node_graph.c b/source/blender/gpu/intern/gpu_node_graph.c index 7f96a3b01c4..bc7ace792bb 100644 --- a/source/blender/gpu/intern/gpu_node_graph.c +++ b/source/blender/gpu/intern/gpu_node_graph.c @@ -331,15 +331,8 @@ void gpu_node_graph_finalize_uniform_attrs(GPUNodeGraph *graph) static char attr_prefix_get(CustomDataType type) { switch (type) { - case CD_MTFACE: - return 'u'; case CD_TANGENT: return 't'; - case CD_MCOL: - case CD_PROP_BYTE_COLOR: - return 'c'; - case CD_PROP_COLOR: - return 'c'; case CD_AUTO_FROM_NAME: return 'a'; case CD_HAIRLENGTH: @@ -372,11 +365,6 @@ static GPUMaterialAttribute *gpu_node_graph_add_attribute(GPUNodeGraph *graph, CustomDataType type, const char *name) { - /* Fall back to the UV layer, which matches old behavior. */ - if (type == CD_AUTO_FROM_NAME && name[0] == '\0') { - type = CD_MTFACE; - } - /* Find existing attribute. */ int num_attributes = 0; GPUMaterialAttribute *attr = graph->attributes.first; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_uv_map.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_uv_map.glsl index d8fcbbfc361..87943cff18f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_uv_map.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_uv_map.glsl @@ -1,4 +1,4 @@ -void node_uvmap(vec3 attr_uv, out vec3 outvec) +void node_uvmap(vec4 attr_uv, out vec3 outvec) { - outvec = attr_uv; + outvec = attr_uv.xyz; } |