[Bf-blender-cvs] [8c3a98e583] clay-engine: Added Matcap HSV variation (only Hue exposed).
Clément Foucault
noreply at git.blender.org
Wed Jan 11 01:49:40 CET 2017
Commit: 8c3a98e5834ded791f1c1ff18f4dd74f49ab59a2
Author: Clément Foucault
Date: Wed Jan 11 01:49:03 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB8c3a98e5834ded791f1c1ff18f4dd74f49ab59a2
Added Matcap HSV variation (only Hue exposed).
===================================================================
M source/blender/draw/engines/clay/clay.c
M source/blender/draw/engines/clay/shaders/clay_frag.glsl
===================================================================
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 074fe6db69..6320479a6d 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -52,6 +52,7 @@ static struct CLAY_data {
struct GPUTexture *matcap_array;
float matcap_colors[24][3];
float matcap_rot[2];
+ float matcap_hsv[3];
int matcap_id;
/* Ssao */
@@ -254,6 +255,7 @@ static void clay_engine_init(void)
if (!data.clay_sh) {
const char *defines =
"#define USE_AO;\n"
+ "#define USE_HSV;\n"
"#define USE_ROTATION;\n";
/* TODO Optimisation : Create shader combinations and bind the right
@@ -304,6 +306,7 @@ static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C
DRW_batch_uniform_vec3(batch, "matcaps_color", (float *)data.matcap_colors, 24);
DRW_batch_uniform_vec2(batch, "matcap_rotation", (float *)data.matcap_rot, 1);
DRW_batch_uniform_int(batch, "matcap_index", &data.matcap_id, 1);
+ DRW_batch_uniform_vec3(batch, "matcap_hsv", (float *)data.matcap_hsv, 1);
/* SSAO */
DRW_batch_uniform_mat4(batch, "WinMatrix", (float *)data.winmat);
@@ -324,6 +327,10 @@ static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C
data.matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
data.matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
+ data.matcap_hsv[0] = settings->matcap_hue;
+ data.matcap_hsv[1] = 1.0f;
+ data.matcap_hsv[2] = 1.0f;
+
data.ssao_params_var[0] = settings->ssao_distance;
data.ssao_params_var[1] = settings->ssao_factor_cavity;
data.ssao_params_var[2] = settings->ssao_factor_edge;
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index d79cc615ab..4db8b56ab6 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -4,10 +4,10 @@ uniform mat4 WinMatrix;
/* Matcap */
uniform sampler2DArray matcaps;
+uniform vec3 matcaps_color[24];
uniform int matcap_index;
uniform vec2 matcap_rotation;
-uniform vec3 matcaps_color[24];
-uniform float matcap_hue;
+uniform vec3 matcap_hsv;
/* Screen Space Occlusion */
/* store the view space vectors for the corners of the view frustum here.
@@ -37,6 +37,95 @@ in vec3 normal;
out vec4 fragColor;
#endif
+#ifdef USE_HSV
+void rgb_to_hsv(vec3 rgb, out vec3 outcol)
+{
+ float cmax, cmin, h, s, v, cdelta;
+ vec3 c;
+
+ cmax = max(rgb[0], max(rgb[1], rgb[2]));
+ cmin = min(rgb[0], min(rgb[1], rgb[2]));
+ cdelta = cmax - cmin;
+
+ v = cmax;
+ if (cmax != 0.0)
+ s = cdelta / cmax;
+ else {
+ s = 0.0;
+ h = 0.0;
+ }
+
+ if (s == 0.0) {
+ h = 0.0;
+ }
+ else {
+ c = (vec3(cmax, cmax, cmax) - rgb.xyz) / cdelta;
+
+ if (rgb.x == cmax) h = c[2] - c[1];
+ else if (rgb.y == cmax) h = 2.0 + c[0] - c[2];
+ else h = 4.0 + c[1] - c[0];
+
+ h /= 6.0;
+
+ if (h < 0.0)
+ h += 1.0;
+ }
+
+ outcol = vec3(h, s, v);
+}
+
+void hsv_to_rgb(vec3 hsv, out vec3 outcol)
+{
+ float i, f, p, q, t, h, s, v;
+ vec3 rgb;
+
+ h = hsv[0];
+ s = hsv[1];
+ v = hsv[2];
+
+ if (s == 0.0) {
+ rgb = vec3(v, v, v);
+ }
+ else {
+ if (h == 1.0)
+ h = 0.0;
+
+ h *= 6.0;
+ i = floor(h);
+ f = h - i;
+ rgb = vec3(f, f, f);
+ p = v * (1.0 - s);
+ q = v * (1.0 - (s * f));
+ t = v * (1.0 - (s * (1.0 - f)));
+
+ if (i == 0.0) rgb = vec3(v, t, p);
+ else if (i == 1.0) rgb = vec3(q, v, p);
+ else if (i == 2.0) rgb = vec3(p, v, t);
+ else if (i == 3.0) rgb = vec3(p, q, v);
+ else if (i == 4.0) rgb = vec3(t, p, v);
+ else rgb = vec3(v, p, q);
+ }
+
+ outcol = rgb;
+}
+
+void hue_sat(float hue, float sat, float value, inout vec3 col)
+{
+ vec3 hsv;
+
+ rgb_to_hsv(col, hsv);
+
+ hsv.x += hue;
+ hsv.x -= floor(hsv.x);
+ hsv.y *= sat;
+ hsv.y = clamp(hsv.y, 0.0, 1.0);
+ hsv.z *= value;
+ hsv.z = clamp(hsv.z, 0.0, 1.0);
+
+ hsv_to_rgb(hsv, col);
+}
+#endif
+
/* simple depth reconstruction, see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
* we change the factors from the article to fit the OpenGL model. */
@@ -152,5 +241,14 @@ void main() {
col *= edges + 1.0;
#endif
+#ifdef USE_HSV
+ hue_sat(matcap_hsv.x, matcap_hsv.y, matcap_hsv.z, col);
+#endif
+
+#ifdef USE_AO
+ /* Apply highlights after hue shift */
+ col *= edges + 1.0;
+#endif
+
fragColor = vec4(col, 1.0);
}
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list