diff options
author | Lukas Stockner <lukas.stockner@freenet.de> | 2018-06-14 18:48:19 +0300 |
---|---|---|
committer | Lukas Stockner <lukas.stockner@freenet.de> | 2018-06-14 23:21:37 +0300 |
commit | 3ee606621cf53a2a4897e534e7e04d3632f419f8 (patch) | |
tree | e8ffff99f0ceeea46aa170298853d8034a1acf1d /intern/cycles/kernel | |
parent | 064e701472ac430c8063ab5d577b5014eecf9ad5 (diff) |
Cycles: Query XYZ to/from Scene Linear conversion from OCIO instead of assuming sRGB
I've limited it to just the RGB<->XYZ stuff for now, correct image handling is the next step.
Reviewers: brecht, sergey
Differential Revision: https://developer.blender.org/D3478
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/kernel_color.h | 38 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_film.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 5 | ||||
-rw-r--r-- | intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/kernels/cuda/kernel.cu | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/kernels/opencl/kernel.cl | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_services.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_color.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/split/kernel_split_common.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_convert.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_image.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_math_util.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_sky.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_wavelength.h | 4 |
16 files changed, 67 insertions, 14 deletions
diff --git a/intern/cycles/kernel/kernel_color.h b/intern/cycles/kernel/kernel_color.h new file mode 100644 index 00000000000..d1c3dac824d --- /dev/null +++ b/intern/cycles/kernel/kernel_color.h @@ -0,0 +1,38 @@ +/* + * Copyright 2011-2018 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __KERNEL_COLOR_H__ +#define __KERNEL_COLOR_H__ + +#include "util/util_color.h" + +CCL_NAMESPACE_BEGIN + +ccl_device float3 xyz_to_rgb(KernelGlobals *kg, float3 xyz) +{ + return make_float3(dot(kernel_data.film.xyz_to_r, xyz), + dot(kernel_data.film.xyz_to_g, xyz), + dot(kernel_data.film.xyz_to_b, xyz)); +} + +ccl_device float linear_rgb_to_gray(KernelGlobals *kg, float3 c) +{ + return dot(c, kernel_data.film.rgb_to_y); +} + +CCL_NAMESPACE_END + +#endif /* __KERNEL_COLOR_H__ */
\ No newline at end of file diff --git a/intern/cycles/kernel/kernel_film.h b/intern/cycles/kernel/kernel_film.h index f9e9b413898..94815601179 100644 --- a/intern/cycles/kernel/kernel_film.h +++ b/intern/cycles/kernel/kernel_film.h @@ -22,9 +22,9 @@ ccl_device float4 film_map(KernelGlobals *kg, float4 irradiance, float scale) float4 result = irradiance*scale; /* conversion to srgb */ - result.x = color_scene_linear_to_srgb(result.x*exposure); - result.y = color_scene_linear_to_srgb(result.y*exposure); - result.z = color_scene_linear_to_srgb(result.z*exposure); + result.x = color_linear_to_srgb(result.x*exposure); + result.y = color_linear_to_srgb(result.y*exposure); + result.z = color_linear_to_srgb(result.z*exposure); /* clamp since alpha might be > 1.0 due to russian roulette */ result.w = saturate(result.w); diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 5382213e6f7..633518c7926 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -1272,6 +1272,11 @@ typedef struct KernelFilm { int pass_denoising_clean; int denoising_flags; + float3 xyz_to_r; + float3 xyz_to_g; + float3 xyz_to_b; + float3 rgb_to_y; + int pad1, pad2, pad3; #ifdef __KERNEL_DEBUG__ diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h index ccca023a15f..5ec1655ab05 100644 --- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h +++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h @@ -30,6 +30,7 @@ # include "kernel/split/kernel_split_data.h" # include "kernel/kernel_globals.h" +# include "kernel/kernel_color.h" # include "kernel/kernels/cpu/kernel_cpu_image.h" # include "kernel/kernel_film.h" # include "kernel/kernel_path.h" diff --git a/intern/cycles/kernel/kernels/cuda/kernel.cu b/intern/cycles/kernel/kernels/cuda/kernel.cu index 3c93e00ccf1..8a180a509e8 100644 --- a/intern/cycles/kernel/kernels/cuda/kernel.cu +++ b/intern/cycles/kernel/kernels/cuda/kernel.cu @@ -26,6 +26,7 @@ #include "kernel/kernel_math.h" #include "kernel/kernel_types.h" #include "kernel/kernel_globals.h" +#include "kernel/kernel_color.h" #include "kernel/kernels/cuda/kernel_cuda_image.h" #include "kernel/kernel_film.h" #include "kernel/kernel_path.h" diff --git a/intern/cycles/kernel/kernels/opencl/kernel.cl b/intern/cycles/kernel/kernels/opencl/kernel.cl index 9d5d784e140..63128d0aecf 100644 --- a/intern/cycles/kernel/kernels/opencl/kernel.cl +++ b/intern/cycles/kernel/kernels/opencl/kernel.cl @@ -20,6 +20,7 @@ #include "kernel/kernel_math.h" #include "kernel/kernel_types.h" #include "kernel/kernel_globals.h" +#include "kernel/kernel_color.h" #include "kernel/kernels/opencl/kernel_opencl_image.h" #include "kernel/kernel_film.h" diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 5f4baf6fda3..1aca54d2ad5 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -41,6 +41,7 @@ #include "kernel/kernel_compat_cpu.h" #include "kernel/split/kernel_split_data_types.h" #include "kernel/kernel_globals.h" +#include "kernel/kernel_color.h" #include "kernel/kernel_random.h" #include "kernel/kernel_projection.h" #include "kernel/kernel_differential.h" diff --git a/intern/cycles/kernel/shaders/node_color.h b/intern/cycles/kernel/shaders/node_color.h index 4a17286a07f..2c3a810cb18 100644 --- a/intern/cycles/kernel/shaders/node_color.h +++ b/intern/cycles/kernel/shaders/node_color.h @@ -14,6 +14,8 @@ * limitations under the License. */ +/* TODO(lukas): Fix colors in OSL. */ + float color_srgb_to_scene_linear(float c) { if (c < 0.04045) diff --git a/intern/cycles/kernel/split/kernel_split_common.h b/intern/cycles/kernel/split/kernel_split_common.h index abe68104449..4b86696691a 100644 --- a/intern/cycles/kernel/split/kernel_split_common.h +++ b/intern/cycles/kernel/split/kernel_split_common.h @@ -23,6 +23,7 @@ #include "kernel/split/kernel_split_data.h" #include "kernel/kernel_globals.h" +#include "kernel/kernel_color.h" #ifdef __OSL__ # include "kernel/osl/osl_shader.h" diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index bfa146f2d93..ce2affe96c8 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -243,7 +243,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a svm_node_geometry(kg, sd, stack, node.y, node.z); break; case NODE_CONVERT: - svm_node_convert(sd, stack, node.y, node.z, node.w); + svm_node_convert(kg, sd, stack, node.y, node.z, node.w); break; case NODE_TEX_COORD: svm_node_tex_coord(kg, sd, path_flag, stack, node, &offset); @@ -465,7 +465,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a svm_node_wireframe(kg, sd, stack, node); break; case NODE_WAVELENGTH: - svm_node_wavelength(sd, stack, node.y, node.z); + svm_node_wavelength(kg, sd, stack, node.y, node.z); break; case NODE_BLACKBODY: svm_node_blackbody(kg, sd, stack, node.y, node.z); diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 886a1333fa3..76464e37c66 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -217,7 +217,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * /* sheen */ if(diffuse_weight > CLOSURE_WEIGHT_CUTOFF && sheen > CLOSURE_WEIGHT_CUTOFF) { - float m_cdlum = linear_rgb_to_gray(base_color); + float m_cdlum = linear_rgb_to_gray(kg, base_color); float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat /* color of the sheen component */ diff --git a/intern/cycles/kernel/svm/svm_convert.h b/intern/cycles/kernel/svm/svm_convert.h index 34080377083..c88ac57e20d 100644 --- a/intern/cycles/kernel/svm/svm_convert.h +++ b/intern/cycles/kernel/svm/svm_convert.h @@ -18,7 +18,7 @@ CCL_NAMESPACE_BEGIN /* Conversion Nodes */ -ccl_device void svm_node_convert(ShaderData *sd, float *stack, uint type, uint from, uint to) +ccl_device void svm_node_convert(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint from, uint to) { switch(type) { case NODE_CONVERT_FI: { @@ -33,13 +33,13 @@ ccl_device void svm_node_convert(ShaderData *sd, float *stack, uint type, uint f } case NODE_CONVERT_CF: { float3 f = stack_load_float3(stack, from); - float g = linear_rgb_to_gray(f); + float g = linear_rgb_to_gray(kg, f); stack_store_float(stack, to, g); break; } case NODE_CONVERT_CI: { float3 f = stack_load_float3(stack, from); - int i = (int)linear_rgb_to_gray(f); + int i = (int)linear_rgb_to_gray(kg, f); stack_store_int(stack, to, i); break; } diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h index 4226e7adfe0..28565308867 100644 --- a/intern/cycles/kernel/svm/svm_image.h +++ b/intern/cycles/kernel/svm/svm_image.h @@ -33,7 +33,8 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, } if(srgb) { - r = color_srgb_to_scene_linear_v4(r); + /* TODO(lukas): Implement proper conversion for image textures. */ + r = color_srgb_to_linear_v4(r); } return r; diff --git a/intern/cycles/kernel/svm/svm_math_util.h b/intern/cycles/kernel/svm/svm_math_util.h index 8e6bc73ddc7..caf0addbf35 100644 --- a/intern/cycles/kernel/svm/svm_math_util.h +++ b/intern/cycles/kernel/svm/svm_math_util.h @@ -138,6 +138,8 @@ ccl_static_constant float blackbody_table_b[6][4] = { ccl_device float3 svm_math_blackbody_color(float t) { + /* TODO(lukas): Reimplement in XYZ. */ + if(t >= 12000.0f) { return make_float3(0.826270103f, 0.994478524f, 1.56626022f); } diff --git a/intern/cycles/kernel/svm/svm_sky.h b/intern/cycles/kernel/svm/svm_sky.h index 854e85fd326..b83a7168541 100644 --- a/intern/cycles/kernel/svm/svm_sky.h +++ b/intern/cycles/kernel/svm/svm_sky.h @@ -59,7 +59,7 @@ ccl_device float3 sky_radiance_old(KernelGlobals *kg, float3 dir, /* convert to RGB */ float3 xyz = xyY_to_xyz(x, y, Y); - return xyz_to_rgb(xyz.x, xyz.y, xyz.z); + return xyz_to_rgb(kg, xyz); } /* @@ -102,7 +102,7 @@ ccl_device float3 sky_radiance_new(KernelGlobals *kg, float3 dir, float z = sky_radiance_internal(config_z, theta, gamma) * radiance_z; /* convert to RGB and adjust strength */ - return xyz_to_rgb(x, y, z) * (M_2PI_F/683); + return xyz_to_rgb(kg, make_float3(x, y, z)) * (M_2PI_F/683); } ccl_device void svm_node_tex_sky(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) diff --git a/intern/cycles/kernel/svm/svm_wavelength.h b/intern/cycles/kernel/svm/svm_wavelength.h index 855b356b397..62e026278ac 100644 --- a/intern/cycles/kernel/svm/svm_wavelength.h +++ b/intern/cycles/kernel/svm/svm_wavelength.h @@ -70,7 +70,7 @@ ccl_static_constant float cie_colour_match[81][3] = { {0.0001f,0.0000f,0.0000f}, {0.0001f,0.0000f,0.0000f}, {0.0000f,0.0000f,0.0000f} }; -ccl_device void svm_node_wavelength(ShaderData *sd, float *stack, uint wavelength, uint color_out) +ccl_device void svm_node_wavelength(KernelGlobals *kg, ShaderData *sd, float *stack, uint wavelength, uint color_out) { float lambda_nm = stack_load_float(stack, wavelength); float ii = (lambda_nm-380.0f) * (1.0f/5.0f); // scaled 0..80 @@ -86,7 +86,7 @@ ccl_device void svm_node_wavelength(ShaderData *sd, float *stack, uint wavelengt color = interp(make_float3(c[0], c[1], c[2]), make_float3(c[3], c[4], c[5]), ii); } - color = xyz_to_rgb(color.x, color.y, color.z); + color = xyz_to_rgb(kg, color); color *= 1.0f/2.52f; // Empirical scale from lg to make all comps <= 1 /* Clamp to zero if values are smaller */ |