Cycles: Match Eevee when processing ramp/camera curves

Slightly increase the number of times ramps/curves are sampled to better
align with the results produced by Eevee.

Pull Request: https://projects.blender.org/blender/blender/pulls/111082
This commit is contained in:
Jesse Yurkovich
2023-08-31 05:08:04 +02:00
committed by Jesse Yurkovich
parent 88a875ec3a
commit 9a1c66d503

View File

@@ -147,13 +147,14 @@ static inline void colorramp_to_array(BL::ColorRamp &ramp,
array<float> &ramp_alpha,
int size)
{
ramp_color.resize(size);
ramp_alpha.resize(size);
const int full_size = size + 1;
ramp_color.resize(full_size);
ramp_alpha.resize(full_size);
for (int i = 0; i < size; i++) {
for (int i = 0; i < full_size; i++) {
float color[4];
ramp.evaluate((float)i / (float)(size - 1), color);
ramp.evaluate(float(i) / float(size), color);
ramp_color[i] = make_float3(color[0], color[1], color[2]);
ramp_alpha[i] = color[3];
}
@@ -183,9 +184,10 @@ static inline void curvemapping_to_array(BL::CurveMapping &cumap, array<float> &
{
cumap.update();
BL::CurveMap curve = cumap.curves[0];
data.resize(size);
for (int i = 0; i < size; i++) {
float t = (float)i / (float)(size - 1);
const int full_size = size + 1;
data.resize(full_size);
for (int i = 0; i < full_size; i++) {
float t = float(i) / float(size);
data[i] = cumap.evaluate(curve, t);
}
}
@@ -204,10 +206,11 @@ static inline void curvemapping_float_to_array(BL::CurveMapping &cumap,
BL::CurveMap map = cumap.curves[0];
data.resize(size);
const int full_size = size + 1;
data.resize(full_size);
for (int i = 0; i < size; i++) {
float t = min + (float)i / (float)(size - 1) * range;
for (int i = 0; i < full_size; i++) {
float t = min + float(i) / float(size) * range;
data[i] = cumap.evaluate(map, t);
}
}
@@ -241,20 +244,21 @@ static inline void curvemapping_color_to_array(BL::CurveMapping &cumap,
BL::CurveMap mapG = cumap.curves[1];
BL::CurveMap mapB = cumap.curves[2];
data.resize(size);
const int full_size = size + 1;
data.resize(full_size);
if (rgb_curve) {
BL::CurveMap mapI = cumap.curves[3];
for (int i = 0; i < size; i++) {
const float t = min_x + (float)i / (float)(size - 1) * range_x;
for (int i = 0; i < full_size; i++) {
const float t = min_x + float(i) / float(size) * range_x;
data[i] = make_float3(cumap.evaluate(mapR, cumap.evaluate(mapI, t)),
cumap.evaluate(mapG, cumap.evaluate(mapI, t)),
cumap.evaluate(mapB, cumap.evaluate(mapI, t)));
}
}
else {
for (int i = 0; i < size; i++) {
float t = min_x + (float)i / (float)(size - 1) * range_x;
for (int i = 0; i < full_size; i++) {
float t = min_x + float(i) / float(size) * range_x;
data[i] = make_float3(
cumap.evaluate(mapR, t), cumap.evaluate(mapG, t), cumap.evaluate(mapB, t));
}