Cycles: Constant fold for the Gamma Node.

This commit is contained in:
Thomas Dinges 2015-12-22 13:53:13 +01:00
parent ba82981a2f
commit 377b52be2e
4 changed files with 33 additions and 6 deletions

View File

@ -21,12 +21,7 @@ ccl_device void svm_node_gamma(ShaderData *sd, float *stack, uint in_gamma, uint
float3 color = stack_load_float3(stack, in_color);
float gamma = stack_load_float(stack, in_gamma);
if(color.x > 0.0f)
color.x = powf(color.x, gamma);
if(color.y > 0.0f)
color.y = powf(color.y, gamma);
if(color.z > 0.0f)
color.z = powf(color.z, gamma);
color = svm_math_gamma_color(color, gamma);
if(stack_valid(out_color))
stack_store_float3(stack, out_color, color);

View File

@ -166,5 +166,17 @@ ccl_device float3 svm_math_blackbody_color(float t) {
return make_float3(4.70366907f, 0.0f, 0.0f);
}
ccl_device_inline float3 svm_math_gamma_color(float3 color, float gamma)
{
if(color.x > 0.0f)
color.x = powf(color.x, gamma);
if(color.y > 0.0f)
color.y = powf(color.y, gamma);
if(color.z > 0.0f)
color.z = powf(color.z, gamma);
return color;
}
CCL_NAMESPACE_END

View File

@ -3516,6 +3516,23 @@ GammaNode::GammaNode()
add_output("Color", SHADER_SOCKET_COLOR);
}
bool GammaNode::constant_fold(ShaderOutput *socket, float3 *optimized_value)
{
ShaderInput *color_in = input("Color");
ShaderInput *gamma_in = input("Gamma");
if(socket == output("Color")) {
if(color_in->link == NULL && gamma_in->link == NULL) {
*optimized_value = svm_math_gamma_color(color_in->value,
gamma_in->value.x);
return true;
}
}
return false;
}
void GammaNode::compile(SVMCompiler& compiler)
{
ShaderInput *color_in = input("Color");

View File

@ -557,6 +557,9 @@ public:
class GammaNode : public ShaderNode {
public:
SHADER_NODE_CLASS(GammaNode)
bool constant_fold(ShaderOutput *socket, float3 *optimized_value);
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
};