[Bf-blender-cvs] [693667b85ef] upstream_cycles_texture_cache: Cycles: Cached textures are now assumed to be linear and converted from sRGB during texture filtering where necessary
Stefan Werner
noreply at git.blender.org
Wed Jun 27 14:04:49 CEST 2018
Commit: 693667b85ef460e1638ee36217958962a6a9c449
Author: Stefan Werner
Date: Mon May 22 13:36:49 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rB693667b85ef460e1638ee36217958962a6a9c449
Cycles: Cached textures are now assumed to be linear and converted from sRGB during texture filtering where necessary
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/kernel/kernel_emission.h
M intern/cycles/kernel/svm/svm_image.h
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M intern/cycles/render/shader.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 8d2ade1e30b..95040b22daa 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -352,7 +352,8 @@ static void create_mesh_volume_attribute(BL::Object& b_ob,
INTERPOLATION_LINEAR,
EXTENSION_CLIP,
use_alpha,
- metadata);
+ metadata,
+ false);
}
static void create_mesh_volume_attributes(Scene *scene,
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 5ff4adad5ec..24239317859 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -96,18 +96,17 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
return false;
differential3 dD;
-
- /* todo: implement */
differential3 dN;
+#ifdef __DNDU__
dN.dx = sd->dNdu;
dN.dy = sd->dNdv;
-
+#else
+ dN = differential3_zero();
+#endif
/* This is how differentials are calculated for a perfect specular reflection.
* This is not the exact value that we should be getting here,
* but it's still better than using zero differentials. */
differential_reflect(&dD, sd->I, &sd->dI, sd->N, &dN);
- dD.dx *= -10.0f;
- dD.dy *= -10.0f;
/* evaluate closure */
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 2d11401c406..e1d97ef8312 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -27,18 +27,24 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
if(kg->oiio && kg->oiio->textures.size() > id && kg->oiio->textures[id].handle) {
OIIO::TextureOpt options;
options.swrap = options.twrap = kg->oiio->textures[id].extension;
+ options.anisotropic = 8;
if(fast_lookup) {
options.interpmode = OIIO::TextureOpt::InterpClosest;
options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
+ //if(path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_DIFFUSE_ANCESTOR))
+ // options.sblur = options.tblur = 1.f/64.f;
}
else {
options.interpmode = kg->oiio->textures[id].interpolation;
options.mipmode = OIIO::TextureOpt::MipModeAniso;
}
- bool success = kg->oiio->tex_sys->texture(kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
+ bool success = kg->oiio->tex_sys->texture(kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 4, (float*)&r);
if(!success) {
(void) kg->oiio->tex_sys->geterror();
+ } else {
+ /* Texture cache is always linear */
+ srgb = 0;
}
}
else
@@ -102,10 +108,27 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, int path_f
if(stack_valid(dx_offset) && stack_valid(dy_offset)) {
float3 dx = stack_load_float3(stack, dx_offset);
float3 dy = stack_load_float3(stack, dy_offset);
- ds.dx = fabsf(dx.x - tex_co.x);
- ds.dy = fabsf(dy.x - tex_co.x);
- dt.dx = fabsf(dx.y - tex_co.y);
- dt.dy = fabsf(dy.y - tex_co.y);
+ float2 tex_co_dx, tex_co_dy;
+ if(projection == NODE_IMAGE_PROJ_SPHERE) {
+ dx = texco_remap_square(dx);
+ tex_co_dx = map_to_sphere(dx);
+ dy = texco_remap_square(dy);
+ tex_co_dy = map_to_sphere(dy);
+ }
+ else if(projection == NODE_IMAGE_PROJ_TUBE) {
+ dx = texco_remap_square(dx);
+ tex_co_dx = map_to_tube(dx);
+ dy = texco_remap_square(dy);
+ tex_co_dy = map_to_tube(dy);
+ }
+ else {
+ tex_co_dx = make_float2(dx.x, dx.y);
+ tex_co_dy = make_float2(dy.x, dy.y);
+ }
+ ds.dx = tex_co_dx.x - tex_co.x;
+ ds.dy = tex_co_dy.x - tex_co.x;
+ dt.dx = tex_co_dx.y - tex_co.y;
+ dt.dy = tex_co_dy.y - tex_co.y;
}
else
#endif
@@ -227,14 +250,55 @@ ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, int
{
uint id = node.y;
uint co_offset, out_offset, alpha_offset, srgb;
- uint projection = node.w;
+ uint projection, dx_offset, dy_offset;
decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &srgb);
+ decode_node_uchar4(node.w, &projection, &dx_offset, &dy_offset, NULL);
+
+ uint use_alpha = stack_valid(alpha_offset);
+ float4 f;
float3 co = stack_load_float3(stack, co_offset);
float2 uv;
co = safe_normalize(co);
+ bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER | PATH_RAY_GLOSSY);
+#ifdef __OIIO__
+ float3 dRdx, dRdy;
+ if(stack_valid(dx_offset) && stack_valid(dy_offset)) {
+ dRdx = co - normalize(stack_load_float3(stack, dx_offset));
+ dRdy = co - normalize(stack_load_float3(stack, dy_offset));
+ }
+ else
+ {
+ dRdx = make_float3(0.0f, 0.0f, 0.0f);
+ dRdy = make_float3(0.0f, 0.0f, 0.0f);
+ }
+ if(kg->oiio && kg->oiio->textures.size() > id && kg->oiio->textures[id].handle && projection == 0) {
+ OIIO::TextureOpt options;
+ options.swrap = options.twrap = kg->oiio->textures[id].extension;
+ options.anisotropic = 8;
+
+ if(fast_lookup) {
+ options.interpmode = OIIO::TextureOpt::InterpClosest;
+ options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
+ // if(path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_DIFFUSE_ANCESTOR))
+ // options.sblur = options.tblur = 1.f/64.f;
+ }
+ else {
+ options.interpmode = kg->oiio->textures[id].interpolation;
+ options.mipmode = OIIO::TextureOpt::MipModeTrilinear;
+ }
+ bool success = kg->oiio->tex_sys->environment (kg->oiio->textures[id].handle, (OIIO::TextureSystem::Perthread*)kg->oiio_tdata, options,
+ Imath::V3f(co.x, -co.y, co.z), Imath::V3f(dRdx.x, -dRdx.y, dRdx.z),
+ Imath::V3f(dRdy.x, -dRdy.y, dRdy.z), use_alpha ? 4 : 3, (float*)&f);
+
+ if(!success) {
+ (void) kg->oiio->tex_sys->geterror();
+ }
+ }
+ else {
+#endif
if(projection == 0)
uv = direction_to_equirectangular(co);
@@ -243,7 +307,10 @@ ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, int
bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER);
uint use_alpha = stack_valid(alpha_offset);
- float4 f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, fast_lookup);
+ f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, fast_lookup);
+#ifdef __OIIO__
+ }
+#endif
if(stack_valid(out_offset))
stack_store_float3(stack, out_offset, make_float3(f.x, f.y, f.z));
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 884ff2ab288..288a8ca2ef3 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -309,7 +309,8 @@ int ImageManager::add_image(const string& filename,
InterpolationType interpolation,
ExtensionType extension,
bool use_alpha,
- ImageMetaData& metadata)
+ ImageMetaData& metadata,
+ bool srgb)
{
Image *img;
size_t slot;
@@ -387,6 +388,7 @@ int ImageManager::add_image(const string& filename,
img->users = 1;
img->use_alpha = use_alpha;
img->mem = NULL;
+ img->srgb = srgb && (!metadata.is_linear);
images[type][slot] = img;
@@ -1075,6 +1077,10 @@ bool ImageManager::make_tx(Image *image, Progress *progress)
ImageSpec config;
config.attribute("maketx:filtername", "lanczos3");
+ if(image->srgb) {
+ config.attribute("maketx:incolorspace", "sRGB");
+ config.attribute("maketx:outcolorspace", "linear");
+ }
bool ok = ImageBufAlgo::make_texture(ImageBufAlgo::MakeTxTexture, image->filename, tx_name, config);
if(ok) {
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index c900b5d1f0b..fc0c959367b 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -56,7 +56,8 @@ public:
InterpolationType interpolation,
ExtensionType extension,
bool use_alpha,
- ImageMetaData& metadata);
+ ImageMetaData& metadata,
+ bool srgb);
void remove_image(int flat_slot);
void remove_image(const string& filename,
void *builtin_data,
@@ -119,6 +120,7 @@ public:
bool use_alpha;
bool need_load;
bool animated;
+ bool srgb;
float frame;
InterpolationType interpolation;
ExtensionType extension;
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 93fa59f45f5..061ea7138da 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -238,8 +238,8 @@ NODE_DEFINE(ImageTextureNode)
SOCKET_FLOAT(projection_blend, "Projection Blend", 0.0f);
SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_UV);
- SOCKET_IN_POINT(vector_dx, "Vector_dx", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_DX);
- SOCKET_IN_POINT(vector_dy, "Vector_dy", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_DY);
+ SOCKET_IN_POINT(vector_dx, "Vector_dx", make_float3(0.0f, 0.0f, 0.0f));
+ SOCKET_IN_POINT(vector_dy, "Vector_dy", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_OUT_COLOR(color, "Color");
SOCKET_OUT_FLOAT(alpha, "Alpha");
@@ -312,7 +312,8 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
interpolation,
extension,
use_alpha,
- metadata);
+ metadata,
+ color_space == NODE_COLOR_SPACE_COLOR);
is_float = metadata.is_float;
is_linear = metadata.is_linear;
}
@@ -381,7 +382,8 @@ void ImageTextureNode::compile(OSLCompiler& compiler)
interpolation,
extension,
use_alpha,
- metadata);
+ metadata,
+ color_space == NODE_COLOR_SPACE_COLOR);
}
is_float = metada
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list