forked from bartvdbraak/blender
Cycles: Constant fold for the Gamma Node.
This commit is contained in:
parent
ba82981a2f
commit
377b52be2e
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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; }
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user