Linear Workflow and Color returned from Shader

On 29/10/2015 at 10:44, xxxxxxxx wrote:

User Information:
Cinema 4D Version:    
Platform:      
Language(s) :

---------
Hi! In my shader, I'm reading a color user data field and return that color from Output(). The problem
is that this color looks different than what the color would look like if I used it directly in a Color shader
or the Color field of the Material channel. However, this is only when Linear Workflow is enabled.

I've only found this topic and I tried calling InitRenderStruct::TransformColor() before I return the
color from ShaderData::Output(), but it did not change the result at all.

return this->_irs->TransformColor(resultColor);

I don't know how to fix this, any ideas? Thanks in advance.
-N

On 29/10/2015 at 11:06, xxxxxxxx wrote:

Maybe the InitRenderStruct is not valid from InitRender() to FreeRender(). I saved the pointer to the
IRS passed to ShaderData::InitRender(). Now that I store a copy of the IRS, it works fine.

INITRENDERRESULT Shader::InitRender(BaseShader* shader, const InitRenderStruct& irs) {
  this->_irs = irs;
  // ...
}
  
Vector Shader::Output(BaseShader* shader, ChannelData* cd) {
  // ..
  return this->_irs.TransformColor(color);
}

On 30/10/2015 at 03:09, xxxxxxxx wrote:

Hello,

a typical pattern to handle linear workflow is to save the transformation type in InitRender() and apply it in Output() using TransformColor(). Something like this:

  
// save color transformation information  
  
if (irs.linear_workflow && irs.document_colorprofile == DOCUMENT_COLORPROFILE_SRGB)  
 _trans = COLORSPACETRANSFORMATION_SRGB_TO_LINEAR;  
else  
 _trans = COLORSPACETRANSFORMATION_NONE;  
   
    
// ...  
  
// apply color transformation  
return TransformColor(result, _trans);  

best wishes,
Sebastian