Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-12-04 18:17:25 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-12-05 23:21:14 +0300
commited5dbb0a7b2bc7bef3776d31eaf466ec8740560f (patch)
tree37c12781edd198932cdd4e47c950460d9f4271cc /intern/cycles/kernel/shaders
parent258564a7b4b26098dc2fabc28aa5a203d2754eff (diff)
Cycles: Implement extrapolation for RGB curves
Previously RGB Curves node will clamp input to 0..1 which is rather useless when one wants to use HDR image textures and do bit of correction on them. Now kernel code supports extrapolation of baked LUT based on first/last two table points and performs linear extrapolation. The only tricky part is to guess the range to bake the LUT for. Currently it's using simple approach -- minmax of the input curves. While this behaves ok for the simple cases it's easy to trick the system up causing incorrect results. Not sure we can solve those issues in a general case and since the new code is giving more expected results it's not that bad actually. In the worst case artist migh always create explicit point to make sure LUT is created for the needed HDR range. Reviewers: brecht, juicyfruit Subscribers: sebastian_k Differential Revision: https://developer.blender.org/D1658
Diffstat (limited to 'intern/cycles/kernel/shaders')
-rw-r--r--intern/cycles/kernel/shaders/node_rgb_curves.osl25
1 files changed, 22 insertions, 3 deletions
diff --git a/intern/cycles/kernel/shaders/node_rgb_curves.osl b/intern/cycles/kernel/shaders/node_rgb_curves.osl
index 60cb273ba98..0427c001f6d 100644
--- a/intern/cycles/kernel/shaders/node_rgb_curves.osl
+++ b/intern/cycles/kernel/shaders/node_rgb_curves.osl
@@ -19,6 +19,21 @@
float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component)
{
+ if (at < 0.0 || at > 1.0) {
+ float t0, dy;
+ if(at < 0.0) {
+ t0 = ramp[0][component];
+ dy = t0 - ramp[1][component];
+ at = -at;
+ }
+ else {
+ t0 = ramp[RAMP_TABLE_SIZE - 1][component];
+ dy = t0 - ramp[RAMP_TABLE_SIZE - 2][component];
+ at = at - 1.0;
+ }
+ return t0 + dy * at * (RAMP_TABLE_SIZE - 1);
+ }
+
float f = clamp(at, 0.0, 1.0) * (RAMP_TABLE_SIZE - 1);
/* clamp int as well in case of NaN */
@@ -37,14 +52,18 @@ float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component)
shader node_rgb_curves(
color ramp[RAMP_TABLE_SIZE] = {0.0},
+ float min_x = 0.0,
+ float max_x = 1.0,
color ColorIn = 0.0,
float Fac = 0.0,
output color ColorOut = 0.0)
{
- ColorOut[0] = ramp_lookup(ramp, ColorIn[0], 0);
- ColorOut[1] = ramp_lookup(ramp, ColorIn[1], 1);
- ColorOut[2] = ramp_lookup(ramp, ColorIn[2], 2);
+ color c = (ColorIn - color(min_x, min_x, min_x)) / (max_x - min_x);
+
+ ColorOut[0] = ramp_lookup(ramp, c[0], 0);
+ ColorOut[1] = ramp_lookup(ramp, c[1], 1);
+ ColorOut[2] = ramp_lookup(ramp, c[2], 2);
ColorOut = mix(ColorIn, ColorOut, Fac);
}