[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55818] trunk/blender/intern/cycles/kernel : Fix #34679: cycles image texture alpha fringes.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Apr 5 20:01:40 CEST 2013


Ah yes, this function seems to require OSL 1.3. We already have that
for Mac and Windows, not sure how you're building OSL on that computer
but ideally we should be using that version or newer for Linux too.

Brecht.

On Fri, Apr 5, 2013 at 7:04 PM, Sergey Sharybin <sergey.vfx at gmail.com> wrote:
> Hi Brecht!
>
> After this change i've got:
>
> /home/sergey/src/blender/blender/intern/cycles/kernel/shaders/node_environment_texture.osl:69:
> error: function 'isconnected' was not declared in this scope
>
> Shall i update something locally (like OSL library) or so?
>
>
> On Fri, Apr 5, 2013 at 10:43 PM, Brecht Van Lommel <
> brechtvanlommel at pandora.be> wrote:
>
>> Revision: 55818
>>
>> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55818
>> Author:   blendix
>> Date:     2013-04-05 16:43:53 +0000 (Fri, 05 Apr 2013)
>> Log Message:
>> -----------
>> Fix #34679: cycles image texture alpha fringes. New rule is now that color
>> output
>> will not give straight RGB values if the alpha output is used, so that
>> mixing with
>> a transparent BSDF gives the correct result.
>>
>> Modified Paths:
>> --------------
>>     trunk/blender/intern/cycles/kernel/shaders/node_color.h
>>     trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl
>>     trunk/blender/intern/cycles/kernel/shaders/node_image_texture.osl
>>     trunk/blender/intern/cycles/kernel/svm/svm_image.h
>>
>> Modified: trunk/blender/intern/cycles/kernel/shaders/node_color.h
>> ===================================================================
>> --- trunk/blender/intern/cycles/kernel/shaders/node_color.h     2013-04-05
>> 16:34:27 UTC (rev 55817)
>> +++ trunk/blender/intern/cycles/kernel/shaders/node_color.h     2013-04-05
>> 16:43:53 UTC (rev 55818)
>> @@ -48,6 +48,14 @@
>>                 color_scene_linear_to_srgb(c[2]));
>>  }
>>
>> +color color_unpremultiply(color c, float alpha)
>> +{
>> +       if(alpha != 1.0 && alpha != 0.0)
>> +               return c/alpha;
>> +
>> +       return c;
>> +}
>> +
>>  /* Color Operations */
>>
>>  color rgb_to_hsv(color rgb)
>>
>> Modified:
>> trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl
>> ===================================================================
>> ---
>> trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl
>> 2013-04-05 16:34:27 UTC (rev 55817)
>> +++
>> trunk/blender/intern/cycles/kernel/shaders/node_environment_texture.osl
>> 2013-04-05 16:43:53 UTC (rev 55818)
>> @@ -66,6 +66,9 @@
>>         /* todo: use environment for better texture filtering of
>> equirectangular */
>>         Color = (color)texture(filename, p[0], 1.0 - p[1], "wrap",
>> "periodic", "alpha", Alpha);
>>
>> +       if (isconnected(Alpha))
>> +               Color = color_unpremultiply(Color, Alpha);
>> +
>>         if (color_space == "sRGB")
>>                 Color = color_srgb_to_scene_linear(Color);
>>  }
>>
>> Modified: trunk/blender/intern/cycles/kernel/shaders/node_image_texture.osl
>> ===================================================================
>> --- trunk/blender/intern/cycles/kernel/shaders/node_image_texture.osl
>> 2013-04-05 16:34:27 UTC (rev 55817)
>> +++ trunk/blender/intern/cycles/kernel/shaders/node_image_texture.osl
>> 2013-04-05 16:43:53 UTC (rev 55818)
>> @@ -19,10 +19,13 @@
>>  #include "stdosl.h"
>>  #include "node_color.h"
>>
>> -color image_texture_lookup(string filename, string color_space, float u,
>> float v, output float Alpha)
>> +color image_texture_lookup(string filename, string color_space, float u,
>> float v, output float Alpha, int use_alpha)
>>  {
>>         color rgb = (color)texture(filename, u, 1.0 - v, "wrap",
>> "periodic", "alpha", Alpha);
>>
>> +       if (use_alpha)
>> +               rgb = color_unpremultiply(rgb, Alpha);
>> +
>>         if (color_space == "sRGB")
>>                 rgb = color_srgb_to_scene_linear(rgb);
>>
>> @@ -44,9 +47,11 @@
>>
>>         if (use_mapping)
>>                 p = transform(mapping, p);
>> +
>> +       int use_alpha = isconnected(Alpha);
>>
>>         if (projection == "Flat") {
>> -               Color = image_texture_lookup(filename, color_space, p[0],
>> p[1], Alpha);
>> +               Color = image_texture_lookup(filename, color_space, p[0],
>> p[1], Alpha, use_alpha);
>>         }
>>         else if (projection == "Box") {
>>                 /* object space normal */
>> @@ -111,15 +116,15 @@
>>                 float tmp_alpha;
>>
>>                 if (weight[0] > 0.0) {
>> -                       Color += weight[0] *
>> image_texture_lookup(filename, color_space, p[1], p[2], tmp_alpha);
>> +                       Color += weight[0] *
>> image_texture_lookup(filename, color_space, p[1], p[2], tmp_alpha,
>> use_alpha);
>>                         Alpha += weight[0] * tmp_alpha;
>>                 }
>>                 if (weight[1] > 0.0) {
>> -                       Color += weight[1] *
>> image_texture_lookup(filename, color_space, p[0], p[2], tmp_alpha);
>> +                       Color += weight[1] *
>> image_texture_lookup(filename, color_space, p[0], p[2], tmp_alpha,
>> use_alpha);
>>                         Alpha += weight[1] * tmp_alpha;
>>                 }
>>                 if (weight[2] > 0.0) {
>> -                       Color += weight[2] *
>> image_texture_lookup(filename, color_space, p[1], p[0], tmp_alpha);
>> +                       Color += weight[2] *
>> image_texture_lookup(filename, color_space, p[1], p[0], tmp_alpha,
>> use_alpha);
>>                         Alpha += weight[2] * tmp_alpha;
>>                 }
>>         }
>>
>> Modified: trunk/blender/intern/cycles/kernel/svm/svm_image.h
>> ===================================================================
>> --- trunk/blender/intern/cycles/kernel/svm/svm_image.h  2013-04-05
>> 16:34:27 UTC (rev 55817)
>> +++ trunk/blender/intern/cycles/kernel/svm/svm_image.h  2013-04-05
>> 16:43:53 UTC (rev 55818)
>> @@ -50,7 +50,7 @@
>>         return x - (float)i;
>>  }
>>
>> -__device float4 svm_image_texture(KernelGlobals *kg, int id, float x,
>> float y, uint srgb)
>> +__device float4 svm_image_texture(KernelGlobals *kg, int id, float x,
>> float y, uint srgb, uint use_alpha)
>>  {
>>         /* first slots are used by float textures, which are not supported
>> here */
>>         if(id < TEX_NUM_FLOAT_IMAGES)
>> @@ -88,6 +88,13 @@
>>         r += ty*(1.0f - tx)*svm_image_texture_read(kg, offset + ix +
>> niy*width);
>>         r += ty*tx*svm_image_texture_read(kg, offset + nix + niy*width);
>>
>> +       if(use_alpha && r.w != 1.0f && r.w != 0.0f) {
>> +               float invw = 1.0f/r.w;
>> +               r.x *= invw;
>> +               r.y *= invw;
>> +               r.z *= invw;
>> +       }
>> +
>>         if(srgb) {
>>                 r.x = color_srgb_to_scene_linear(r.x);
>>                 r.y = color_srgb_to_scene_linear(r.y);
>> @@ -99,7 +106,7 @@
>>
>>  #else
>>
>> -__device float4 svm_image_texture(KernelGlobals *kg, int id, float x,
>> float y, uint srgb)
>> +__device float4 svm_image_texture(KernelGlobals *kg, int id, float x,
>> float y, uint srgb, uint use_alpha)
>>  {
>>         float4 r;
>>
>> @@ -222,6 +229,13 @@
>>         }
>>  #endif
>>
>> +       if(use_alpha && r.w != 1.0f && r.w != 0.0f) {
>> +               float invw = 1.0f/r.w;
>> +               r.x *= invw;
>> +               r.y *= invw;
>> +               r.z *= invw;
>> +       }
>> +
>>         if(srgb) {
>>                 r.x = color_srgb_to_scene_linear(r.x);
>>                 r.y = color_srgb_to_scene_linear(r.y);
>> @@ -241,7 +255,8 @@
>>         decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset,
>> &srgb);
>>
>>         float3 co = stack_load_float3(stack, co_offset);
>> -       float4 f = svm_image_texture(kg, id, co.x, co.y, srgb);
>> +       uint use_alpha = stack_valid(alpha_offset);
>> +       float4 f = svm_image_texture(kg, id, co.x, co.y, srgb, use_alpha);
>>
>>         if(stack_valid(out_offset))
>>                 stack_store_float3(stack, out_offset, make_float3(f.x,
>> f.y, f.z));
>> @@ -322,13 +337,14 @@
>>         uint id = node.y;
>>
>>         float4 f = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
>> +       uint use_alpha = stack_valid(alpha_offset);
>>
>>         if(weight.x > 0.0f)
>> -               f += weight.x*svm_image_texture(kg, id, co.y, co.z, srgb);
>> +               f += weight.x*svm_image_texture(kg, id, co.y, co.z, srgb,
>> use_alpha);
>>         if(weight.y > 0.0f)
>> -               f += weight.y*svm_image_texture(kg, id, co.x, co.z, srgb);
>> +               f += weight.y*svm_image_texture(kg, id, co.x, co.z, srgb,
>> use_alpha);
>>         if(weight.z > 0.0f)
>> -               f += weight.z*svm_image_texture(kg, id, co.y, co.x, srgb);
>> +               f += weight.z*svm_image_texture(kg, id, co.y, co.x, srgb,
>> use_alpha);
>>
>>         if(stack_valid(out_offset))
>>                 stack_store_float3(stack, out_offset, make_float3(f.x,
>> f.y, f.z));
>> @@ -355,7 +371,8 @@
>>         else
>>                 uv = direction_to_mirrorball(co);
>>
>> -       float4 f = svm_image_texture(kg, id, uv.x, uv.y, srgb);
>> +       uint use_alpha = stack_valid(alpha_offset);
>> +       float4 f = svm_image_texture(kg, id, uv.x, uv.y, srgb, use_alpha);
>>
>>         if(stack_valid(out_offset))
>>                 stack_store_float3(stack, out_offset, make_float3(f.x,
>> f.y, f.z));
>>
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
>
>
>
> --
> With best regards, Sergey Sharybin
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers


More information about the Bf-committers mailing list