[Bf-blender-cvs] [8f76d05fa59] blender2.8: Workbench: GLSL performance + code style
Jeroen Bakker
noreply at git.blender.org
Wed Apr 25 11:55:27 CEST 2018
Commit: 8f76d05fa59124275f2dbd4aafdc8f46e6fe77a3
Author: Jeroen Bakker
Date: Wed Apr 25 11:54:02 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB8f76d05fa59124275f2dbd4aafdc8f46e6fe77a3
Workbench: GLSL performance + code style
- store normal in vec2
- use rgba_8 for colorBuffer
===================================================================
M source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M source/blender/draw/engines/workbench/workbench_materials.c
===================================================================
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index fbe4f556b30..8b03b058301 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -12,3 +12,24 @@ float bayer_dither_noise() {
ivec2 tx2 = ivec2(gl_FragCoord.xy) % 2;
return dither_mat4x4[tx1.x][tx1.y];
}
+
+/* From http://aras-p.info/texts/CompactNormalStorage.html
+ * Using Method #4: Spheremap Transform */
+vec3 normal_decode(vec2 enc)
+{
+ vec2 fenc = enc * 4.0 - 2.0;
+ float f = dot(fenc, fenc);
+ float g = sqrt(1.0 - f / 4.0);
+ vec3 n;
+ n.xy = fenc*g;
+ n.z = 1 - f / 2;
+ return n;
+}
+
+/* From http://aras-p.info/texts/CompactNormalStorage.html
+ * Using Method #4: Spheremap Transform */
+vec2 normal_encode(vec3 n)
+{
+ float p = sqrt(n.z * 8.0 + 8.0);
+ return n.xy / p + 0.5;
+}
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 ccb94f56db8..77729733fd7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -1,9 +1,10 @@
out vec4 fragColor;
uniform usampler2D objectId;
-uniform sampler2D depth;
-uniform sampler2D diffuseColor;
-uniform sampler2D normalViewport;
+uniform sampler2D depthBuffer;
+uniform sampler2D colorBuffer;
+uniform sampler2D normalBuffer;
+/* normalBuffer contains viewport normals */
uniform vec2 invertedViewportSize;
uniform vec3 objectOverlapColor = vec3(0.0);
@@ -16,12 +17,12 @@ layout(std140) uniform world_block {
void main()
{
ivec2 texel = ivec2(gl_FragCoord.xy);
- vec2 uvViewport = gl_FragCoord.xy * invertedViewportSize;
- float depth = texelFetch(depth, texel, 0).r;
+ vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
+ float depth = texelFetch(depthBuffer, texel, 0).r;
#ifndef V3D_DRAWOPTION_OBJECT_OVERLAP
if (depth == 1.0) {
- fragColor = vec4(background_color(world_data, uvViewport.y), 0.0);
+ fragColor = vec4(background_color(world_data, uv_viewport.y), 0.0);
return;
}
#else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
@@ -29,7 +30,7 @@ void main()
float object_overlap = calculate_object_overlap(objectId, texel, object_id);
if (object_id == NO_OBJECT_ID) {
- vec3 background = background_color(world_data, uvViewport.y);
+ vec3 background = background_color(world_data, uv_viewport.y);
if (object_overlap == 0.0) {
fragColor = vec4(background, 0.0);
} else {
@@ -39,10 +40,10 @@ void main()
}
#endif /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
- vec3 diffuse_color = texelFetch(diffuseColor, texel, 0).rgb;
+ vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb;
#ifdef V3D_LIGHTING_STUDIO
- vec3 normal_viewport = texelFetch(normalViewport, texel, 0).rgb;
+ vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport);
vec3 shaded_color = diffuse_light * diffuse_color;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 208c684f722..0f7e5a1b170 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -5,11 +5,11 @@ in vec3 normal_viewport;
out uint objectId;
out vec3 diffuseColor;
-out vec3 normalViewport;
+out vec2 normalViewport;
void main()
{
objectId = uint(object_id);
diffuseColor = object_color;
- normalViewport = normal_viewport;
+ normalViewport = normal_encode(normal_viewport);
}
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 90d224d70da..662cbc6a544 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -36,8 +36,8 @@ static struct {
struct GPUShader *composite_sh_cache[MAX_SHADERS];
struct GPUTexture *object_id_tx; /* ref only, not alloced */
- struct GPUTexture *diffuse_color_tx; /* ref only, not alloced */
- struct GPUTexture *normal_viewport_tx; /* ref only, not alloced */
+ struct GPUTexture *color_buffer_tx; /* ref only, not alloced */
+ struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
int next_object_id;
} e_data = {NULL};
@@ -100,6 +100,20 @@ static char *workbench_build_composite_frag(WORKBENCH_PrivateData *wpd)
return str;
}
+static char *workbench_build_prepass_frag(void)
+{
+ char *str = NULL;
+
+ DynStr *ds = BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
+ BLI_dynstr_append(ds, datatoc_workbench_prepass_frag_glsl);
+
+ str = BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+ return str;
+}
+
static int get_shader_index(WORKBENCH_PrivateData *wpd)
{
return (wpd->drawtype_options << 2) + wpd->drawtype_lighting;
@@ -112,10 +126,12 @@ static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
if (e_data.prepass_sh_cache[index] == NULL) {
char *defines = workbench_build_defines(wpd);
char *composite_frag = workbench_build_composite_frag(wpd);
- e_data.prepass_sh_cache[index] = DRW_shader_create(datatoc_workbench_prepass_vert_glsl, NULL, datatoc_workbench_prepass_frag_glsl, defines);
+ char *prepass_frag = workbench_build_prepass_frag();
+ e_data.prepass_sh_cache[index] = DRW_shader_create(datatoc_workbench_prepass_vert_glsl, NULL, prepass_frag, defines);
e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
- MEM_freeN(defines);
+ MEM_freeN(prepass_frag);
MEM_freeN(composite_frag);
+ MEM_freeN(defines);
}
wpd->prepass_sh = e_data.prepass_sh_cache[index];
@@ -180,14 +196,14 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata)
const float *viewport_size = DRW_viewport_size_get();
const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_R_32U, &draw_engine_workbench_solid);
- e_data.diffuse_color_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RGBA_32, &draw_engine_workbench_solid);
- e_data.normal_viewport_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RGBA_32, &draw_engine_workbench_solid);
+ e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RGBA_8, &draw_engine_workbench_solid);
+ e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], DRW_TEX_RG_8, &draw_engine_workbench_solid);
GPU_framebuffer_ensure_config(&fbl->prepass_fb, {
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
- GPU_ATTACHMENT_TEXTURE(e_data.diffuse_color_tx),
- GPU_ATTACHMENT_TEXTURE(e_data.normal_viewport_tx),
+ GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
+ GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
});
}
@@ -243,13 +259,13 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
psl->composite_pass = DRW_pass_create("Composite", DRW_STATE_WRITE_COLOR);
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass);
- DRW_shgroup_uniform_texture_ref(grp, "depth", &dtxl->depth);
- DRW_shgroup_uniform_texture_ref(grp, "diffuseColor", &e_data.diffuse_color_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &e_data.color_buffer_tx);
if (OBJECT_ID_PASS_ENABLED(wpd)) {
DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
}
if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
- DRW_shgroup_uniform_texture_ref(grp, "normalViewport", &e_data.normal_viewport_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &e_data.normal_buffer_tx);
}
wpd->world_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_World), NULL);
DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
More information about the Bf-blender-cvs
mailing list