[Bf-blender-cvs] [71fce3c] strand_gpu: Augmentation of the strand shader with a debugging shader.
Lukas Tönne
noreply at git.blender.org
Sun Jul 17 11:47:44 CEST 2016
Commit: 71fce3c784681ffbe165949f0f37982ff072e023
Author: Lukas Tönne
Date: Sun Jul 17 11:46:40 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB71fce3c784681ffbe165949f0f37982ff072e023
Augmentation of the strand shader with a debugging shader.
The debug shader shares most code with the regular shader. It uses a
geometry shader pass to create extra vector lines.
===================================================================
M release/scripts/startup/bl_ui/properties_data_modifier.py
M source/blender/editors/space_view3d/drawstrands.c
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/GPU_strands.h
M source/blender/gpu/intern/gpu_strands_shader.c
A source/blender/gpu/shaders/gpu_shader_strand_debug_frag.glsl
A source/blender/gpu/shaders/gpu_shader_strand_debug_geom.glsl
A source/blender/gpu/shaders/gpu_shader_strand_debug_vert.glsl
M source/blender/gpu/shaders/gpu_shader_strand_frag.glsl
M source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
M source/blender/gpu/shaders/gpu_shader_strand_util.glsl
M source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/intern/MOD_strands.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index f122418..2422557 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -919,6 +919,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.prop(md, "use_geometry_shader")
layout.prop(md, "debug_value")
+ layout.prop(md, "debug_scale")
def SUBSURF(self, layout, ob, md):
layout.row().prop(md, "subdivision_type", expand=True)
diff --git a/source/blender/editors/space_view3d/drawstrands.c b/source/blender/editors/space_view3d/drawstrands.c
index 2ad3471..4c2f56d 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -102,14 +102,14 @@ static int get_effects(int smd_effects)
}
static void bind_strands_shader(GPUStrandsShader *shader, RegionView3D *rv3d,
- Object *ob, StrandsModifierData *smd)
+ Object *ob, StrandsModifierData *smd, int debug_value)
{
GPU_strand_shader_bind_uniforms(shader, ob->obmat, rv3d->viewmat);
GPU_strand_shader_bind(shader, rv3d->viewmat, rv3d->viewinv,
smd->ribbon_width,
smd->clump_thickness, smd->clump_shape,
smd->curl_thickness, smd->curl_shape, smd->curl_radius, smd->curl_length,
- smd->debug_value);
+ debug_value, smd->debug_scale);
}
void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
@@ -122,6 +122,7 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
bool show_strands = smd->flag & MOD_STRANDS_SHOW_FIBERS;
bool use_geomshader = smd->flag & MOD_STRANDS_USE_GEOMSHADER;
GPUStrands_FiberPrimitive fiber_primitive = get_fiber_primitive(smd->fiber_primitive);
+ bool enable_debugging = (smd->debug_value != 0);
if (strands == NULL)
return;
@@ -155,14 +156,14 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
}
if (show_strands) {
- bind_strands_shader(shader, rv3d, ob, smd);
+ bind_strands_shader(shader, rv3d, ob, smd, 0);
GPU_strands_setup_fibers(buffer, converter);
if (use_geomshader) {
if (buffer->fibers) {
struct GPUAttrib *attrib;
int num_attrib;
- GPU_strand_shader_get_fiber_attributes(shader, &attrib, &num_attrib);
+ GPU_strand_shader_get_fiber_attributes(shader, false, &attrib, &num_attrib);
int elemsize = GPU_attrib_element_size(attrib, num_attrib);
GPU_interleaved_attrib_setup(buffer->fibers, attrib, num_attrib, elemsize, false);
@@ -176,7 +177,7 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
if (buffer->fiber_points && buffer->fiber_indices) {
struct GPUAttrib *attrib;
int num_attrib;
- GPU_strand_shader_get_fiber_attributes(shader, &attrib, &num_attrib);
+ GPU_strand_shader_get_fiber_attributes(shader, false, &attrib, &num_attrib);
int elemsize = GPU_attrib_element_size(attrib, num_attrib);
GPU_interleaved_attrib_setup(buffer->fiber_points, attrib, num_attrib, elemsize, false);
@@ -200,5 +201,26 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
GPU_strand_shader_unbind(shader);
}
+ if (enable_debugging) {
+ bind_strands_shader(shader, rv3d, ob, smd, smd->debug_value);
+
+ GPU_strands_setup_fibers(buffer, converter);
+ if (buffer->fiber_points && buffer->fiber_indices) {
+ struct GPUAttrib *attrib;
+ int num_attrib;
+ GPU_strand_shader_get_fiber_attributes(shader, true, &attrib, &num_attrib);
+
+ int elemsize = GPU_attrib_element_size(attrib, num_attrib);
+ GPU_interleaved_attrib_setup(buffer->fiber_points, attrib, num_attrib, elemsize, false);
+
+ glDrawArrays(GL_POINTS, 0, buffer->fiber_totverts * elemsize);
+
+ GPU_interleaved_attrib_unbind();
+ }
+ GPU_strands_buffer_unbind();
+
+ GPU_strand_shader_unbind(shader);
+ }
+
converter->free(converter);
}
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index f832bcd..e0ac32e 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -129,6 +129,9 @@ data_to_c_simple(shaders/gpu_shader_fx_lib.glsl SRC)
data_to_c_simple(shaders/gpu_shader_strand_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_strand_geom.glsl SRC)
data_to_c_simple(shaders/gpu_shader_strand_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_strand_debug_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_strand_debug_geom.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_strand_debug_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_strand_effects.glsl SRC)
data_to_c_simple(shaders/gpu_shader_strand_util.glsl SRC)
diff --git a/source/blender/gpu/GPU_strands.h b/source/blender/gpu/GPU_strands.h
index ec74196..e85bd65 100644
--- a/source/blender/gpu/GPU_strands.h
+++ b/source/blender/gpu/GPU_strands.h
@@ -78,14 +78,14 @@ void GPU_strand_shader_bind(
float ribbon_width,
float clump_thickness, float clump_shape,
float curl_thickness, float curl_shape, float curl_radius, float curl_length,
- int debug_value);
+ int debug_value, float debug_scale);
void GPU_strand_shader_bind_uniforms(
GPUStrandsShader *gpu_shader,
float obmat[4][4], float viewmat[4][4]);
void GPU_strand_shader_unbind(GPUStrandsShader *gpu_shader);
bool GPU_strand_shader_bound(GPUStrandsShader *gpu_shader);
-void GPU_strand_shader_get_fiber_attributes(struct GPUStrandsShader *gpu_shader,
+void GPU_strand_shader_get_fiber_attributes(struct GPUStrandsShader *gpu_shader, bool debug,
struct GPUAttrib **r_attrib, int *r_num);
diff --git a/source/blender/gpu/intern/gpu_strands_shader.c b/source/blender/gpu/intern/gpu_strands_shader.c
index 92da50a..6a1fce3 100644
--- a/source/blender/gpu/intern/gpu_strands_shader.c
+++ b/source/blender/gpu/intern/gpu_strands_shader.c
@@ -48,6 +48,7 @@
#include "GPU_strands.h"
#include "GPU_shader.h"
+#define MAX_DEFINES 1024
struct GPUStrandsShader {
bool bound;
@@ -55,19 +56,28 @@ struct GPUStrandsShader {
GPUShader *shader;
GPUAttrib attributes[GPU_MAX_ATTRIB];
int num_attributes;
-
char *fragmentcode;
char *geometrycode;
char *vertexcode;
+
+ GPUShader *debug_shader;
+ GPUAttrib debug_attributes[GPU_MAX_ATTRIB];
+ int num_debug_attributes;
+ char *debug_fragmentcode;
+ char *debug_geometrycode;
+ char *debug_vertexcode;
};
extern char datatoc_gpu_shader_strand_frag_glsl[];
extern char datatoc_gpu_shader_strand_geom_glsl[];
extern char datatoc_gpu_shader_strand_vert_glsl[];
+extern char datatoc_gpu_shader_strand_debug_frag_glsl[];
+extern char datatoc_gpu_shader_strand_debug_geom_glsl[];
+extern char datatoc_gpu_shader_strand_debug_vert_glsl[];
extern char datatoc_gpu_shader_strand_effects_glsl[];
extern char datatoc_gpu_shader_strand_util_glsl[];
-static char *codegen_vertex(void)
+static char *codegen(const char *basecode)
{
char *code;
@@ -75,7 +85,7 @@ static char *codegen_vertex(void)
BLI_dynstr_append(ds, datatoc_gpu_shader_strand_util_glsl);
BLI_dynstr_append(ds, datatoc_gpu_shader_strand_effects_glsl);
- BLI_dynstr_append(ds, datatoc_gpu_shader_strand_vert_glsl);
+ BLI_dynstr_append(ds, basecode);
code = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
@@ -83,39 +93,120 @@ static char *codegen_vertex(void)
return code;
}
-static char *codegen_geometry(void)
+static void get_defines(GPUStrandsShaderParams *params, char *defines)
{
- char *code;
-
- DynStr *ds = BLI_dynstr_new();
- BLI_dynstr_append(ds, datatoc_gpu_shader_strand_util_glsl);
- BLI_dynstr_append(ds, datatoc_gpu_shader_strand_effects_glsl);
- BLI_dynstr_append(ds, datatoc_gpu_shader_strand_geom_glsl);
+ switch (params->shader_model) {
+ case GPU_STRAND_SHADER_CLASSIC_BLENDER:
+ strcat(defines, "#define SHADING_CLASSIC_BLENDER\n");
+ break;
+ case GPU_STRAND_SHADER_KAJIYA:
+ strcat(defines, "#define SHADING_KAJIYA\n");
+ break;
+ case GPU_STRAND_SHADER_MARSCHNER:
+ strcat(defines, "#define SHADING_MARSCHNER\n");
+ break;
+ }
+ switch (params->fiber_primitive) {
+ case GPU_STRANDS_FIBER_LINE:
+ strcat(defines, "#define FIBER_LINE\n");
+ break;
+ case GPU_STRANDS_FIBER_RIBBON:
+ strcat(defines, "#define FIBER_RIBBON\n");
+ break;
+ }
- code = BLI_dynstr_get_cstring(ds);
- BLI_dynstr_free(ds);
+ if (params->effects & GPU_STRAND_EFFECT_CLUMP)
+ strcat(defines, "#define USE_EFFECT_CLUMPING\n");
+ if (params->effects & GPU_STRAND_EFFECT_CURL)
+ strcat(defines, "#define USE_EFFECT_CURL\n");
- return code;
+ if (params->use_geomshader) {
+ strcat(defines, "#define USE_GEOMSHADER\n");
+ }
}
-static char *codegen_fragment(void)
+static void set_texture_uniforms(GPUShader *shader)
{
- char *code;
-
- DynStr *ds = BLI_dynstr_new();
-
- BLI_dynstr_append(ds, datatoc_gpu_shader_strand_util_glsl);
- BLI_dynstr_append(ds, datatoc_gpu_shader_strand_frag_glsl);
+ GPU_shader_bind(shader);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_curves"), 0);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_points"), 1);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_normals"), 2);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_tangents"), 3);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.fiber_position"), 4);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.fiber_control_index"), 5);
+ GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.fiber_control_weight"), 6);
+ GPU_shader_unbind();
+}
+
+static void get_shader_attributes(GPUShader *shader, bool use_geomshader,
+ GPUAttrib *r_attributes, int *r_num_attributes)
+{
+ GPUAttrib *attr = r_attributes;
- code = BLI_dynstr_get_cstring(ds);
- BLI_dynstr_free(ds);
+ if (use_geomshader) {
+ /* position */
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list