diff options
author | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-03-29 13:00:33 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2022-03-29 17:28:19 +0300 |
commit | 31dc94461d738d3021300e1a2c4b239f1cd68aa1 (patch) | |
tree | fa5ed7c2e0c1649c18cafa2ed0a66cfcc2cb1dbe /source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl | |
parent | 067ae9260f2a8109b3c421be13fac47b6843e098 (diff) |
Fix T96356: artefacts with GPU subdivision and vertex paint mask
The lines paint mask IBO extraction was not implemented for GPU subdivision.
For it to work, we also now need to preserve the subdivision loop to
subdivision edge map, which until now was overwritten to store coarse edges
(the map to coarse edges is still preserved).
Also the paint flag stored in the 4th dimension of the loop normal buffer
was not properly set for flat shaded faces, leading to other kind of
artefacts and render issues.
Diffstat (limited to 'source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl')
-rw-r--r-- | source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl b/source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl index 8b4a5dd14f3..c3aa74ec18c 100644 --- a/source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl +++ b/source/blender/draw/intern/shaders/common_subdiv_vbo_lnor_comp.glsl @@ -13,9 +13,14 @@ layout(std430, binding = 2) readonly buffer extraCoarseFaceData layout(std430, binding = 3) writeonly buffer outputLoopNormals { - vec3 output_lnor[]; + LoopNormal output_lnor[]; }; +bool is_face_selected(uint coarse_quad_index) +{ + return (extra_coarse_face_data[coarse_quad_index] & coarse_face_select_mask) != 0; +} + void main() { /* We execute for each quad. */ @@ -34,7 +39,7 @@ void main() /* Face is smooth, use vertex normals. */ for (int i = 0; i < 4; i++) { PosNorLoop pos_nor_loop = pos_nor[start_loop_index + i]; - output_lnor[start_loop_index + i] = get_vertex_nor(pos_nor_loop); + output_lnor[start_loop_index + i] = get_normal_and_flag(pos_nor_loop); } } else { @@ -50,8 +55,19 @@ void main() add_newell_cross_v3_v3v3(face_normal, v3, v0); face_normal = normalize(face_normal); + + LoopNormal loop_normal; + loop_normal.nx = face_normal.x; + loop_normal.ny = face_normal.y; + loop_normal.nz = face_normal.z; + loop_normal.flag = 0.0; + + if (is_face_selected(coarse_quad_index)) { + loop_normal.flag = 1.0; + } + for (int i = 0; i < 4; i++) { - output_lnor[start_loop_index + i] = face_normal; + output_lnor[start_loop_index + i] = loop_normal; } } } |