[Bf-blender-cvs] [46f8367eaca] tmp-workbench-rewrite: Workbench: Refactor: Add support for Flat shading
Clément Foucault
noreply at git.blender.org
Tue Mar 3 17:35:48 CET 2020
Commit: 46f8367eaca30607ef9623ae8e020d0ae210bec4
Author: Clément Foucault
Date: Sat Feb 29 17:22:04 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB46f8367eaca30607ef9623ae8e020d0ae210bec4
Workbench: Refactor: Add support for Flat shading
===================================================================
M source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M source/blender/draw/engines/workbench/workbench_data.c
M source/blender/draw/engines/workbench/workbench_materials.c
M source/blender/draw/engines/workbench/workbench_opaque.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_shader.c
M source/blender/draw/engines/workbench/workbench_studiolight.c
===================================================================
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index de6029434f3..19f6ce5f14c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -25,6 +25,17 @@ void main()
vec3 specular_color = mix(vec3(0.05), base_color.rgb, metallic);
vec3 diffuse_color = mix(base_color.rgb, vec3(0.0), metallic);
+#ifdef V3D_LIGHTING_MATCAP
+ fragColor.rgb = vec3(1.0);
+#endif
+
+#ifdef V3D_LIGHTING_STUDIO
fragColor.rgb = get_world_lighting(diffuse_color, specular_color, roughness, normal, I_vs);
+#endif
+
+#ifdef V3D_LIGHTING_FLAT
+ fragColor.rgb = base_color.rgb;
+#endif
+
fragColor.a = 1.0;
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
index aa3a0a30408..1d8950e34b3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
@@ -5,12 +5,12 @@ layout(std140) uniform material_block
};
/* If set to -1, the resource handle is used instead. */
-uniform int material_index;
+uniform int materialIndex;
void workbench_material_data_get(
int handle, out vec3 color, out float alpha, out float roughness, out float metallic)
{
- handle = (material_index != -1) ? material_index : handle;
+ handle = (materialIndex != -1) ? materialIndex : handle;
vec4 data = mat_data[uint(handle) & 0xFFFu];
color = data.rgb;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 18301062df4..5f960bdeba9 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -20,8 +20,6 @@ in vec3 nor;
in vec4 ac; /* active color */
in vec2 au; /* active texture layer */
-uniform bool useVertexColor = false;
-
void main()
{
vec3 world_pos = point_object_to_world(pos);
@@ -38,7 +36,7 @@ void main()
float alpha, metallic, roughness;
workbench_material_data_get(resource_handle, color_interp, alpha, roughness, metallic);
- if (useVertexColor) {
+ if (materialIndex == 0) {
color_interp = ac.rgb;
}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 88d099f91ba..b89ef1e9ad8 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -160,7 +160,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene = draw_ctx->scene;
WORKBENCH_ViewLayerData *vldata = workbench_view_layer_data_ensure_ex(draw_ctx->view_layer);
- RegionView3D *rv3d = draw_ctx->rv3d;
View3D *v3d = draw_ctx->v3d;
wpd->ctx_mode = CTX_data_mode_enum_ex(
@@ -225,14 +224,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
wd->curvature_ridge = 0.5f / max_ff(SQUARE(wpd->shading.curvature_ridge_factor), 1e-4f);
wd->curvature_valley = 0.7f / max_ff(SQUARE(wpd->shading.curvature_valley_factor), 1e-4f);
- /* Will be NULL when rendering. */
- if (RV3D_CLIPPING_ENABLED(v3d, rv3d)) {
- wpd->world_clip_planes = rv3d->clip;
- }
- else {
- wpd->world_clip_planes = NULL;
- }
-
workbench_world_data_update_shadow_direction_vs(wpd);
workbench_viewvecs_update(wpd->world_data.viewvecs);
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 99fd2e09a4c..f6fe90dbab8 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -509,7 +509,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
DRWShadingGroup *grp = wpd->prepass_shgrp;
*grp_mat = grp = DRW_shgroup_create_sub(grp);
DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
- DRW_shgroup_uniform_int_copy(grp, "material_index", id & 0xFFFu);
+ DRW_shgroup_uniform_int_copy(grp, "materialIndex", id & 0xFFFu);
return grp;
}
case V3D_SHADING_VERTEX_COLOR: {
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index f662302cf86..07692abebcb 100644
--- a/source/blender/draw/engines/workbench/workbench_opaque.c
+++ b/source/blender/draw/engines/workbench/workbench_opaque.c
@@ -65,13 +65,16 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data)
{
WORKBENCH_PassList *psl = data->psl;
WORKBENCH_PrivateData *wpd = data->stl->wpd;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ RegionView3D *rv3d = draw_ctx->rv3d;
+ View3D *v3d = draw_ctx->v3d;
struct GPUShader *sh;
DRWShadingGroup *grp;
const bool use_matcap = (wpd->shading.light == V3D_LIGHTING_MATCAP);
{
- DRWState clip_state = WORLD_CLIPPING_ENABLED(wpd) ? DRW_STATE_CLIP_PLANES : 0;
+ DRWState clip_state = RV3D_CLIPPING_ENABLED(v3d, rv3d) ? DRW_STATE_CLIP_PLANES : 0;
DRWState cull_state = CULL_BACKFACE_ENABLED(wpd) ? DRW_STATE_CULL_BACK : 0;
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
@@ -81,27 +84,24 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data)
wpd->prepass_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
- DRW_shgroup_uniform_int_copy(grp, "material_index", -1);
- DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
- DRW_shgroup_uniform_bool_copy(grp, "useVertexColor", false);
+ DRW_shgroup_uniform_int_copy(grp, "materialIndex", -1);
wpd->prepass_vcol_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
DRW_shgroup_uniform_block_persistent(grp, "material_block", wpd->material_ubo_curr);
- DRW_shgroup_uniform_int_copy(grp, "material_index", 0); /* Default material. */
- DRW_shgroup_uniform_bool_copy(grp, "useVertexColor", true);
+ DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. (uses vcol) */
sh = workbench_shader_opaque_image_get(wpd, false);
wpd->prepass_image_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
DRW_shgroup_uniform_block_persistent(grp, "material_block", wpd->material_ubo_curr);
- DRW_shgroup_uniform_int_copy(grp, "material_index", 0); /* Default material. */
+ DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
sh = workbench_shader_opaque_image_get(wpd, true);
wpd->prepass_image_tiled_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
DRW_shgroup_uniform_block_persistent(grp, "material_block", wpd->material_ubo_curr);
- DRW_shgroup_uniform_int_copy(grp, "material_index", 0); /* Default material. */
+ DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
// DRW_PASS_CREATE(psl->ghost_prepass_pass, state | cull_state | clip_state);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index dcb28b59df3..b6580c9cacc 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -35,7 +35,7 @@
#include "workbench_engine.h"
#define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
-#define MAX_COMPOSITE_SHADERS (1 << 7)
+#define MAX_COMPOSITE_SHADERS (1 << 3)
#define MAX_PREPASS_SHADERS (1 << 8)
#define MAX_ACCUM_SHADERS (1 << 8)
#define MAX_CAVITY_SHADERS (1 << 3)
@@ -85,7 +85,8 @@
#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) \
(NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd))
#define NORMAL_ENCODING_ENABLED() (true)
-#define WORLD_CLIPPING_ENABLED(wpd) (wpd->world_clip_planes != NULL)
+/* TODO remove */
+#define WORLD_CLIPPING_ENABLED(wpd) (false)
struct RenderEngine;
struct RenderLayer;
@@ -254,8 +255,6 @@ typedef struct WORKBENCH_PrivateData {
bool shadow_changed;
bool is_playback;
- float (*world_clip_planes)[4];
-
/* Opaque pipeline */
struct GPUTexture *object_id_tx;
struct GPUTexture *material_buffer_tx;
diff --git a/source/blender/draw/engines/workbench/workbench_shader.c b/source/blender/draw/engines/workbench/workbench_shader.c
index c99dd56a836..7a0883e632d 100644
--- a/source/blender/draw/engines/workbench/workbench_shader.c
+++ b/source/blender/draw/engines/workbench/workbench_shader.c
@@ -89,12 +89,22 @@ void workbench_shader_library_ensure(void)
}
}
-static char *workbench_build_defines(WORKBENCH_PrivateData *UNUSED(wpd))
+static char *workbench_build_defines(WORKBENCH_PrivateData *wpd)
{
char *str = NULL;
DynStr *ds = BLI_dynstr_new();
+ if (wpd->shading.light == V3D_LIGHTING_STUDIO) {
+ BLI_dynstr_append(ds, "#define V3D_LIGHTING_STUDIO\n");
+ }
+ else if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
+ BLI_dynstr_append(ds, "#define V3D_LIGHTING_MATCAP\n");
+ }
+ else {
+ BLI_dynstr_append(ds, "#define V3D_LIGHTING_FLAT\n");
+ }
+
if (NORMAL_ENCODING_ENABLED()) {
BLI_dynstr_append(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
}
@@ -174,7 +184,8 @@ GPUShader *workbench_shader_opaque_hair_get(WORKBENCH_PrivateData *UNUSED(wpd))
GPUShader *workbench_shader_composite_get(WORKBENCH_PrivateData *wpd)
{
- int index = 0;
+ int index = wpd->shading.light;
+ BLI_assert(index < MAX_COMPOSITE_SHADERS);
if (e_data.composite_sh[index] == NULL) {
char *defines = workbench_build_defines(wpd);
char *frag = DRW_shader_library_create_shader_string(e_data.lib,
diff --git a/source/blender/draw/engines/workbe
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list