Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
- index 86ad6e1a061..d1008d5c983 100644
- --- a/intern/cycles/kernel/kernel_accumulate.h
- +++ b/intern/cycles/kernel/kernel_accumulate.h
- @@ -440,6 +440,7 @@ ccl_device_inline void path_radiance_accum_total_light(
- #endif
- }
- +// bookmark: does the value here need to be converted to spectral?
- ccl_device_inline void path_radiance_accum_background(
- PathRadiance *L,
- ccl_addr_space PathState *state,
- diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h
- index afb63152830..f1014da7649 100644
- --- a/intern/cycles/kernel/kernel_bake.h
- +++ b/intern/cycles/kernel/kernel_bake.h
- @@ -68,7 +68,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg,
- /* sample emission */
- if((pass_filter & BAKE_FILTER_EMISSION) && (sd->flag & SD_EMISSION)) {
- - float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf);
- + float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf, state.wavelengths);
- path_radiance_accum_emission(&L_sample, &state, throughput, emission);
- }
- @@ -137,7 +137,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg,
- /* sample emission */
- if((pass_filter & BAKE_FILTER_EMISSION) && (sd->flag & SD_EMISSION)) {
- - float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf);
- + float3 emission = indirect_primitive_emission(kg, sd, 0.0f, state.flag, state.ray_pdf, state.wavelengths);
- path_radiance_accum_emission(&L_sample, &state, throughput, emission);
- }
- @@ -352,7 +352,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
- out = make_float3(roughness, roughness, roughness);
- }
- else {
- - out = shader_emissive_eval(kg, &sd);
- + out = shader_emissive_eval(kg, &sd, state.wavelengths);
- }
- break;
- }
- diff --git a/intern/cycles/kernel/kernel_color.h b/intern/cycles/kernel/kernel_color.h
- index 990e798543a..2dd82b356c5 100644
- --- a/intern/cycles/kernel/kernel_color.h
- +++ b/intern/cycles/kernel/kernel_color.h
- @@ -33,6 +33,754 @@ ccl_device float linear_rgb_to_gray(KernelGlobals *kg, float3 c)
- return dot(c, float4_to_float3(kernel_data.film.rgb_to_y));
- }
- +ccl_device float float_lerp(float start, float end, float progress)
- +{
- + return start + ((end - start) * progress);
- +}
- +
- +ccl_device float3 wavelength_to_xyz(float wavelength)
- +{
- + float4 lookup[] = {
- + make_float4(380.0, 0.0014, 0.0000, 0.0065),
- + make_float4(381.0, 0.0015, 0.0000, 0.0070),
- + make_float4(382.0, 0.0016, 0.0000, 0.0077),
- + make_float4(383.0, 0.0018, 0.0001, 0.0085),
- + make_float4(384.0, 0.0020, 0.0001, 0.0094),
- + make_float4(385.0, 0.0022, 0.0001, 0.0105),
- + make_float4(386.0, 0.0025, 0.0001, 0.0120),
- + make_float4(387.0, 0.0029, 0.0001, 0.0136),
- + make_float4(388.0, 0.0033, 0.0001, 0.0155),
- + make_float4(389.0, 0.0037, 0.0001, 0.0177),
- + make_float4(390.0, 0.0042, 0.0001, 0.0201),
- + make_float4(391.0, 0.0048, 0.0001, 0.0225),
- + make_float4(392.0, 0.0053, 0.0002, 0.0252),
- + make_float4(393.0, 0.0060, 0.0002, 0.0284),
- + make_float4(394.0, 0.0068, 0.0002, 0.0320),
- + make_float4(395.0, 0.0077, 0.0002, 0.0362),
- + make_float4(396.0, 0.0088, 0.0002, 0.0415),
- + make_float4(397.0, 0.0100, 0.0003, 0.0473),
- + make_float4(398.0, 0.0113, 0.0003, 0.0536),
- + make_float4(399.0, 0.0128, 0.0004, 0.0605),
- + make_float4(400.0, 0.0143, 0.0004, 0.0679),
- + make_float4(401.0, 0.0156, 0.0004, 0.0741),
- + make_float4(402.0, 0.0171, 0.0005, 0.0810),
- + make_float4(403.0, 0.0188, 0.0005, 0.0891),
- + make_float4(404.0, 0.0208, 0.0006, 0.0988),
- + make_float4(405.0, 0.0232, 0.0006, 0.1102),
- + make_float4(406.0, 0.0263, 0.0007, 0.1249),
- + make_float4(407.0, 0.0298, 0.0008, 0.1418),
- + make_float4(408.0, 0.0339, 0.0009, 0.1612),
- + make_float4(409.0, 0.0384, 0.0011, 0.1830),
- + make_float4(410.0, 0.0435, 0.0012, 0.2074),
- + make_float4(411.0, 0.0489, 0.0014, 0.2334),
- + make_float4(412.0, 0.0550, 0.0015, 0.2625),
- + make_float4(413.0, 0.0618, 0.0017, 0.2949),
- + make_float4(414.0, 0.0693, 0.0019, 0.3311),
- + make_float4(415.0, 0.0776, 0.0022, 0.3713),
- + make_float4(416.0, 0.0871, 0.0025, 0.4170),
- + make_float4(417.0, 0.0976, 0.0028, 0.4673),
- + make_float4(418.0, 0.1089, 0.0031, 0.5221),
- + make_float4(419.0, 0.1212, 0.0035, 0.5815),
- + make_float4(420.0, 0.1344, 0.0040, 0.6456),
- + make_float4(421.0, 0.1497, 0.0046, 0.7201),
- + make_float4(422.0, 0.1657, 0.0052, 0.7980),
- + make_float4(423.0, 0.1820, 0.0058, 0.8780),
- + make_float4(424.0, 0.1985, 0.0065, 0.9588),
- + make_float4(425.0, 0.2148, 0.0073, 1.0391),
- + make_float4(426.0, 0.2299, 0.0081, 1.1141),
- + make_float4(427.0, 0.2445, 0.0089, 1.1868),
- + make_float4(428.0, 0.2584, 0.0098, 1.2566),
- + make_float4(429.0, 0.2716, 0.0107, 1.3230),
- + make_float4(430.0, 0.2839, 0.0116, 1.3856),
- + make_float4(431.0, 0.2948, 0.0126, 1.4419),
- + make_float4(432.0, 0.3047, 0.0136, 1.4939),
- + make_float4(433.0, 0.3136, 0.0146, 1.5414),
- + make_float4(434.0, 0.3216, 0.0157, 1.5844),
- + make_float4(435.0, 0.3285, 0.0168, 1.6230),
- + make_float4(436.0, 0.3343, 0.0180, 1.6561),
- + make_float4(437.0, 0.3391, 0.0192, 1.6848),
- + make_float4(438.0, 0.3430, 0.0204, 1.7094),
- + make_float4(439.0, 0.3461, 0.0217, 1.7301),
- + make_float4(440.0, 0.3483, 0.0230, 1.7471),
- + make_float4(441.0, 0.3496, 0.0243, 1.7599),
- + make_float4(442.0, 0.3501, 0.0256, 1.7695),
- + make_float4(443.0, 0.3500, 0.0270, 1.7763),
- + make_float4(444.0, 0.3493, 0.0284, 1.7805),
- + make_float4(445.0, 0.3481, 0.0298, 1.7826),
- + make_float4(446.0, 0.3464, 0.0313, 1.7833),
- + make_float4(447.0, 0.3444, 0.0329, 1.7823),
- + make_float4(448.0, 0.3420, 0.0345, 1.7800),
- + make_float4(449.0, 0.3392, 0.0362, 1.7765),
- + make_float4(450.0, 0.3362, 0.0380, 1.7721),
- + make_float4(451.0, 0.3333, 0.0398, 1.7688),
- + make_float4(452.0, 0.3301, 0.0418, 1.7647),
- + make_float4(453.0, 0.3267, 0.0438, 1.7593),
- + make_float4(454.0, 0.3229, 0.0458, 1.7525),
- + make_float4(455.0, 0.3187, 0.0480, 1.7441),
- + make_float4(456.0, 0.3140, 0.0502, 1.7335),
- + make_float4(457.0, 0.3089, 0.0526, 1.7208),
- + make_float4(458.0, 0.3033, 0.0550, 1.7060),
- + make_float4(459.0, 0.2973, 0.0574, 1.6889),
- + make_float4(460.0, 0.2908, 0.0600, 1.6692),
- + make_float4(461.0, 0.2839, 0.0626, 1.6473),
- + make_float4(462.0, 0.2766, 0.0653, 1.6226),
- + make_float4(463.0, 0.2687, 0.0680, 1.5946),
- + make_float4(464.0, 0.2602, 0.0709, 1.5632),
- + make_float4(465.0, 0.2511, 0.0739, 1.5281),
- + make_float4(466.0, 0.2406, 0.0770, 1.4849),
- + make_float4(467.0, 0.2297, 0.0803, 1.4386),
- + make_float4(468.0, 0.2184, 0.0837, 1.3897),
- + make_float4(469.0, 0.2069, 0.0872, 1.3392),
- + make_float4(470.0, 0.1954, 0.0910, 1.2876),
- + make_float4(471.0, 0.1844, 0.0949, 1.2382),
- + make_float4(472.0, 0.1735, 0.0991, 1.1887),
- + make_float4(473.0, 0.1628, 0.1034, 1.1394),
- + make_float4(474.0, 0.1523, 0.1079, 1.0904),
- + make_float4(475.0, 0.1421, 0.1126, 1.0419),
- + make_float4(476.0, 0.1322, 0.1175, 0.9943),
- + make_float4(477.0, 0.1226, 0.1226, 0.9474),
- + make_float4(478.0, 0.1133, 0.1279, 0.9015),
- + make_float4(479.0, 0.1043, 0.1334, 0.8567),
- + make_float4(480.0, 0.0956, 0.1390, 0.8130),
- + make_float4(481.0, 0.0873, 0.1446, 0.7706),
- + make_float4(482.0, 0.0793, 0.1504, 0.7296),
- + make_float4(483.0, 0.0718, 0.1564, 0.6902),
- + make_float4(484.0, 0.0646, 0.1627, 0.6523),
- + make_float4(485.0, 0.0580, 0.1693, 0.6162),
- + make_float4(486.0, 0.0519, 0.1763, 0.5825),
- + make_float4(487.0, 0.0463, 0.1836, 0.5507),
- + make_float4(488.0, 0.0412, 0.1913, 0.5205),
- + make_float4(489.0, 0.0364, 0.1994, 0.4920),
- + make_float4(490.0, 0.0320, 0.2080, 0.4652),
- + make_float4(491.0, 0.0279, 0.2171, 0.4399),
- + make_float4(492.0, 0.0241, 0.2267, 0.4162),
- + make_float4(493.0, 0.0207, 0.2368, 0.3939),
- + make_float4(494.0, 0.0175, 0.2474, 0.3730),
- + make_float4(495.0, 0.0147, 0.2586, 0.3533),
- + make_float4(496.0, 0.0121, 0.2702, 0.3349),
- + make_float4(497.0, 0.0099, 0.2824, 0.3176),
- + make_float4(498.0, 0.0079, 0.2952, 0.3014),
- + make_float4(499.0, 0.0063, 0.3087, 0.2862),
- + make_float4(500.0, 0.0049, 0.3230, 0.2720),
- + make_float4(501.0, 0.0037, 0.3385, 0.2588),
- + make_float4(502.0, 0.0029, 0.3548, 0.2464),
- + make_float4(503.0, 0.0024, 0.3717, 0.2346),
- + make_float4(504.0, 0.0022, 0.3893, 0.2233),
- + make_float4(505.0, 0.0024, 0.4073, 0.2123),
- + make_float4(506.0, 0.0029, 0.4256, 0.2010),
- + make_float4(507.0, 0.0038, 0.4443, 0.1899),
- + make_float4(508.0, 0.0052, 0.4635, 0.1790),
- + make_float4(509.0, 0.0070, 0.4830, 0.1685),
- + make_float4(510.0, 0.0093, 0.5030, 0.1582),
- + make_float4(511.0, 0.0122, 0.5237, 0.1481),
- + make_float4(512.0, 0.0156, 0.5447, 0.1384),
- + make_float4(513.0, 0.0195, 0.5658, 0.1290),
- + make_float4(514.0, 0.0240, 0.5870, 0.1201),
- + make_float4(515.0, 0.0291, 0.6082, 0.1117),
- + make_float4(516.0, 0.0349, 0.6293, 0.1040),
- + make_float4(517.0, 0.0412, 0.6502, 0.0968),
- + make_float4(518.0, 0.0480, 0.6707, 0.0901),
- + make_float4(519.0, 0.0554, 0.6906, 0.0839),
- + make_float4(520.0, 0.0633, 0.7100, 0.0782),
- + make_float4(521.0, 0.0716, 0.7280, 0.0733),
- + make_float4(522.0, 0.0805, 0.7453, 0.0687),
- + make_float4(523.0, 0.0898, 0.7619, 0.0646),
- + make_float4(524.0, 0.0995, 0.7778, 0.0608),
- + make_float4(525.0, 0.1096, 0.7932, 0.0573),
- + make_float4(526.0, 0.1202, 0.8082, 0.0539),
- + make_float4(527.0, 0.1311, 0.8225, 0.0507),
- + make_float4(528.0, 0.1423, 0.8363, 0.0477),
- + make_float4(529.0, 0.1538, 0.8495, 0.0449),
- + make_float4(530.0, 0.1655, 0.8620, 0.0422),
- + make_float4(531.0, 0.1772, 0.8738, 0.0395),
- + make_float4(532.0, 0.1891, 0.8849, 0.0369),
- + make_float4(533.0, 0.2011, 0.8955, 0.0344),
- + make_float4(534.0, 0.2133, 0.9054, 0.0321),
- + make_float4(535.0, 0.2257, 0.9149, 0.0298),
- + make_float4(536.0, 0.2383, 0.9237, 0.0277),
- + make_float4(537.0, 0.2511, 0.9321, 0.0257),
- + make_float4(538.0, 0.2640, 0.9399, 0.0238),
- + make_float4(539.0, 0.2771, 0.9472, 0.0220),
- + make_float4(540.0, 0.2904, 0.9540, 0.0203),
- + make_float4(541.0, 0.3039, 0.9602, 0.0187),
- + make_float4(542.0, 0.3176, 0.9660, 0.0172),
- + make_float4(543.0, 0.3314, 0.9712, 0.0159),
- + make_float4(544.0, 0.3455, 0.9760, 0.0146),
- + make_float4(545.0, 0.3597, 0.9803, 0.0134),
- + make_float4(546.0, 0.3741, 0.9841, 0.0123),
- + make_float4(547.0, 0.3886, 0.9874, 0.0113),
- + make_float4(548.0, 0.4034, 0.9904, 0.0104),
- + make_float4(549.0, 0.4183, 0.9929, 0.0095),
- + make_float4(550.0, 0.4334, 0.9950, 0.0087),
- + make_float4(551.0, 0.4488, 0.9967, 0.0080),
- + make_float4(552.0, 0.4644, 0.9981, 0.0074),
- + make_float4(553.0, 0.4801, 0.9992, 0.0068),
- + make_float4(554.0, 0.4960, 0.9998, 0.0062),
- + make_float4(555.0, 0.5121, 1.0000, 0.0057),
- + make_float4(556.0, 0.5283, 0.9998, 0.0053),
- + make_float4(557.0, 0.5447, 0.9993, 0.0049),
- + make_float4(558.0, 0.5612, 0.9983, 0.0045),
- + make_float4(559.0, 0.5778, 0.9969, 0.0042),
- + make_float4(560.0, 0.5945, 0.9950, 0.0039),
- + make_float4(561.0, 0.6112, 0.9926, 0.0036),
- + make_float4(562.0, 0.6280, 0.9897, 0.0034),
- + make_float4(563.0, 0.6448, 0.9865, 0.0031),
- + make_float4(564.0, 0.6616, 0.9827, 0.0029),
- + make_float4(565.0, 0.6784, 0.9786, 0.0027),
- + make_float4(566.0, 0.6953, 0.9741, 0.0026),
- + make_float4(567.0, 0.7121, 0.9692, 0.0024),
- + make_float4(568.0, 0.7288, 0.9639, 0.0023),
- + make_float4(569.0, 0.7455, 0.9581, 0.0022),
- + make_float4(570.0, 0.7621, 0.9520, 0.0021),
- + make_float4(571.0, 0.7785, 0.9454, 0.0020),
- + make_float4(572.0, 0.7948, 0.9385, 0.0019),
- + make_float4(573.0, 0.8109, 0.9312, 0.0019),
- + make_float4(574.0, 0.8268, 0.9235, 0.0018),
- + make_float4(575.0, 0.8425, 0.9154, 0.0018),
- + make_float4(576.0, 0.8579, 0.9070, 0.0018),
- + make_float4(577.0, 0.8731, 0.8983, 0.0017),
- + make_float4(578.0, 0.8879, 0.8892, 0.0017),
- + make_float4(579.0, 0.9023, 0.8798, 0.0017),
- + make_float4(580.0, 0.9163, 0.8700, 0.0017),
- + make_float4(581.0, 0.9298, 0.8598, 0.0016),
- + make_float4(582.0, 0.9428, 0.8494, 0.0016),
- + make_float4(583.0, 0.9553, 0.8386, 0.0015),
- + make_float4(584.0, 0.9672, 0.8276, 0.0015),
- + make_float4(585.0, 0.9786, 0.8163, 0.0014),
- + make_float4(586.0, 0.9894, 0.8048, 0.0013),
- + make_float4(587.0, 0.9996, 0.7931, 0.0013),
- + make_float4(588.0, 1.0091, 0.7812, 0.0012),
- + make_float4(589.0, 1.0181, 0.7692, 0.0012),
- + make_float4(590.0, 1.0263, 0.7570, 0.0011),
- + make_float4(591.0, 1.0340, 0.7448, 0.0011),
- + make_float4(592.0, 1.0410, 0.7324, 0.0011),
- + make_float4(593.0, 1.0471, 0.7200, 0.0010),
- + make_float4(594.0, 1.0524, 0.7075, 0.0010),
- + make_float4(595.0, 1.0567, 0.6949, 0.0010),
- + make_float4(596.0, 1.0597, 0.6822, 0.0010),
- + make_float4(597.0, 1.0617, 0.6695, 0.0009),
- + make_float4(598.0, 1.0628, 0.6567, 0.0009),
- + make_float4(599.0, 1.0630, 0.6439, 0.0008),
- + make_float4(600.0, 1.0622, 0.6310, 0.0008),
- + make_float4(601.0, 1.0608, 0.6182, 0.0008),
- + make_float4(602.0, 1.0585, 0.6053, 0.0007),
- + make_float4(603.0, 1.0552, 0.5925, 0.0007),
- + make_float4(604.0, 1.0509, 0.5796, 0.0006),
- + make_float4(605.0, 1.0456, 0.5668, 0.0006),
- + make_float4(606.0, 1.0389, 0.5540, 0.0005),
- + make_float4(607.0, 1.0313, 0.5411, 0.0005),
- + make_float4(608.0, 1.0226, 0.5284, 0.0004),
- + make_float4(609.0, 1.0131, 0.5157, 0.0004),
- + make_float4(610.0, 1.0026, 0.5030, 0.0003),
- + make_float4(611.0, 0.9914, 0.4905, 0.0003),
- + make_float4(612.0, 0.9794, 0.4781, 0.0003),
- + make_float4(613.0, 0.9665, 0.4657, 0.0003),
- + make_float4(614.0, 0.9529, 0.4534, 0.0003),
- + make_float4(615.0, 0.9384, 0.4412, 0.0002),
- + make_float4(616.0, 0.9232, 0.4291, 0.0002),
- + make_float4(617.0, 0.9072, 0.4170, 0.0002),
- + make_float4(618.0, 0.8904, 0.4050, 0.0002),
- + make_float4(619.0, 0.8728, 0.3930, 0.0002),
- + make_float4(620.0, 0.8544, 0.3810, 0.0002),
- + make_float4(621.0, 0.8349, 0.3689, 0.0002),
- + make_float4(622.0, 0.8148, 0.3568, 0.0002),
- + make_float4(623.0, 0.7941, 0.3447, 0.0001),
- + make_float4(624.0, 0.7729, 0.3328, 0.0001),
- + make_float4(625.0, 0.7514, 0.3210, 0.0001),
- + make_float4(626.0, 0.7296, 0.3094, 0.0001),
- + make_float4(627.0, 0.7077, 0.2979, 0.0001),
- + make_float4(628.0, 0.6858, 0.2867, 0.0001),
- + make_float4(629.0, 0.6640, 0.2757, 0.0001),
- + make_float4(630.0, 0.6424, 0.2650, 0.0000),
- + make_float4(631.0, 0.6217, 0.2548, 0.0000),
- + make_float4(632.0, 0.6013, 0.2450, 0.0000),
- + make_float4(633.0, 0.5812, 0.2354, 0.0000),
- + make_float4(634.0, 0.5614, 0.2261, 0.0000),
- + make_float4(635.0, 0.5419, 0.2170, 0.0000),
- + make_float4(636.0, 0.5226, 0.2081, 0.0000),
- + make_float4(637.0, 0.5035, 0.1995, 0.0000),
- + make_float4(638.0, 0.4847, 0.1911, 0.0000),
- + make_float4(639.0, 0.4662, 0.1830, 0.0000),
- + make_float4(640.0, 0.4479, 0.1750, 0.0000),
- + make_float4(641.0, 0.4298, 0.1672, 0.0000),
- + make_float4(642.0, 0.4121, 0.1596, 0.0000),
- + make_float4(643.0, 0.3946, 0.1523, 0.0000),
- + make_float4(644.0, 0.3775, 0.1451, 0.0000),
- + make_float4(645.0, 0.3608, 0.1382, 0.0000),
- + make_float4(646.0, 0.3445, 0.1315, 0.0000),
- + make_float4(647.0, 0.3286, 0.1250, 0.0000),
- + make_float4(648.0, 0.3131, 0.1188, 0.0000),
- + make_float4(649.0, 0.2980, 0.1128, 0.0000),
- + make_float4(650.0, 0.2835, 0.1070, 0.0000),
- + make_float4(651.0, 0.2696, 0.1015, 0.0000),
- + make_float4(652.0, 0.2562, 0.0962, 0.0000),
- + make_float4(653.0, 0.2432, 0.0911, 0.0000),
- + make_float4(654.0, 0.2307, 0.0863, 0.0000),
- + make_float4(655.0, 0.2187, 0.0816, 0.0000),
- + make_float4(656.0, 0.2071, 0.0771, 0.0000),
- + make_float4(657.0, 0.1959, 0.0728, 0.0000),
- + make_float4(658.0, 0.1852, 0.0687, 0.0000),
- + make_float4(659.0, 0.1748, 0.0648, 0.0000),
- + make_float4(660.0, 0.1649, 0.0610, 0.0000),
- + make_float4(661.0, 0.1554, 0.0574, 0.0000),
- + make_float4(662.0, 0.1462, 0.0539, 0.0000),
- + make_float4(663.0, 0.1375, 0.0507, 0.0000),
- + make_float4(664.0, 0.1291, 0.0475, 0.0000),
- + make_float4(665.0, 0.1212, 0.0446, 0.0000),
- + make_float4(666.0, 0.1136, 0.0418, 0.0000),
- + make_float4(667.0, 0.1065, 0.0391, 0.0000),
- + make_float4(668.0, 0.0997, 0.0366, 0.0000),
- + make_float4(669.0, 0.0934, 0.0342, 0.0000),
- + make_float4(670.0, 0.0874, 0.0320, 0.0000),
- + make_float4(671.0, 0.0819, 0.0300, 0.0000),
- + make_float4(672.0, 0.0768, 0.0281, 0.0000),
- + make_float4(673.0, 0.0721, 0.0263, 0.0000),
- + make_float4(674.0, 0.0677, 0.0247, 0.0000),
- + make_float4(675.0, 0.0636, 0.0232, 0.0000),
- + make_float4(676.0, 0.0598, 0.0218, 0.0000),
- + make_float4(677.0, 0.0563, 0.0205, 0.0000),
- + make_float4(678.0, 0.0529, 0.0193, 0.0000),
- + make_float4(679.0, 0.0498, 0.0181, 0.0000),
- + make_float4(680.0, 0.0468, 0.0170, 0.0000),
- + make_float4(681.0, 0.0437, 0.0159, 0.0000),
- + make_float4(682.0, 0.0408, 0.0148, 0.0000),
- + make_float4(683.0, 0.0380, 0.0138, 0.0000),
- + make_float4(684.0, 0.0354, 0.0128, 0.0000),
- + make_float4(685.0, 0.0329, 0.0119, 0.0000),
- + make_float4(686.0, 0.0306, 0.0111, 0.0000),
- + make_float4(687.0, 0.0284, 0.0103, 0.0000),
- + make_float4(688.0, 0.0264, 0.0095, 0.0000),
- + make_float4(689.0, 0.0245, 0.0088, 0.0000),
- + make_float4(690.0, 0.0227, 0.0082, 0.0000),
- + make_float4(691.0, 0.0211, 0.0076, 0.0000),
- + make_float4(692.0, 0.0196, 0.0071, 0.0000),
- + make_float4(693.0, 0.0182, 0.0066, 0.0000),
- + make_float4(694.0, 0.0170, 0.0061, 0.0000),
- + make_float4(695.0, 0.0158, 0.0057, 0.0000),
- + make_float4(696.0, 0.0148, 0.0053, 0.0000),
- + make_float4(697.0, 0.0138, 0.0050, 0.0000),
- + make_float4(698.0, 0.0129, 0.0047, 0.0000),
- + make_float4(699.0, 0.0121, 0.0044, 0.0000),
- + make_float4(700.0, 0.0114, 0.0041, 0.0000),
- + make_float4(701.0, 0.0106, 0.0038, 0.0000),
- + make_float4(702.0, 0.0099, 0.0036, 0.0000),
- + make_float4(703.0, 0.0093, 0.0034, 0.0000),
- + make_float4(704.0, 0.0087, 0.0031, 0.0000),
- + make_float4(705.0, 0.0081, 0.0029, 0.0000),
- + make_float4(706.0, 0.0076, 0.0027, 0.0000),
- + make_float4(707.0, 0.0071, 0.0026, 0.0000),
- + make_float4(708.0, 0.0066, 0.0024, 0.0000),
- + make_float4(709.0, 0.0062, 0.0022, 0.0000),
- + make_float4(710.0, 0.0058, 0.0021, 0.0000),
- + make_float4(711.0, 0.0054, 0.0020, 0.0000),
- + make_float4(712.0, 0.0051, 0.0018, 0.0000),
- + make_float4(713.0, 0.0047, 0.0017, 0.0000),
- + make_float4(714.0, 0.0044, 0.0016, 0.0000),
- + make_float4(715.0, 0.0041, 0.0015, 0.0000),
- + make_float4(716.0, 0.0038, 0.0014, 0.0000),
- + make_float4(717.0, 0.0036, 0.0013, 0.0000),
- + make_float4(718.0, 0.0033, 0.0012, 0.0000),
- + make_float4(719.0, 0.0031, 0.0011, 0.0000),
- + make_float4(720.0, 0.0029, 0.0010, 0.0000),
- + make_float4(721.0, 0.0027, 0.0010, 0.0000),
- + make_float4(722.0, 0.0025, 0.0009, 0.0000),
- + make_float4(723.0, 0.0024, 0.0008, 0.0000),
- + make_float4(724.0, 0.0022, 0.0008, 0.0000),
- + make_float4(725.0, 0.0020, 0.0007, 0.0000),
- + make_float4(726.0, 0.0019, 0.0007, 0.0000),
- + make_float4(727.0, 0.0018, 0.0006, 0.0000),
- + make_float4(728.0, 0.0017, 0.0006, 0.0000),
- + make_float4(729.0, 0.0015, 0.0006, 0.0000),
- + make_float4(730.0, 0.0014, 0.0005, 0.0000),
- + make_float4(731.0, 0.0013, 0.0005, 0.0000),
- + make_float4(732.0, 0.0012, 0.0004, 0.0000),
- + make_float4(733.0, 0.0012, 0.0004, 0.0000),
- + make_float4(734.0, 0.0011, 0.0004, 0.0000),
- + make_float4(735.0, 0.0010, 0.0004, 0.0000),
- + make_float4(736.0, 0.0009, 0.0003, 0.0000),
- + make_float4(737.0, 0.0009, 0.0003, 0.0000),
- + make_float4(738.0, 0.0008, 0.0003, 0.0000),
- + make_float4(739.0, 0.0007, 0.0003, 0.0000),
- + make_float4(740.0, 0.0007, 0.0002, 0.0000),
- + make_float4(741.0, 0.0006, 0.0002, 0.0000),
- + make_float4(742.0, 0.0006, 0.0002, 0.0000),
- + make_float4(743.0, 0.0006, 0.0002, 0.0000),
- + make_float4(744.0, 0.0005, 0.0002, 0.0000),
- + make_float4(745.0, 0.0005, 0.0002, 0.0000),
- + make_float4(746.0, 0.0004, 0.0002, 0.0000),
- + make_float4(747.0, 0.0004, 0.0001, 0.0000),
- + make_float4(748.0, 0.0004, 0.0001, 0.0000),
- + make_float4(749.0, 0.0004, 0.0001, 0.0000),
- + make_float4(750.0, 0.0003, 0.0001, 0.0000),
- + make_float4(751.0, 0.0003, 0.0001, 0.0000),
- + make_float4(752.0, 0.0003, 0.0001, 0.0000),
- + make_float4(753.0, 0.0003, 0.0001, 0.0000),
- + make_float4(754.0, 0.0003, 0.0001, 0.0000),
- + make_float4(755.0, 0.0002, 0.0001, 0.0000),
- + make_float4(756.0, 0.0002, 0.0001, 0.0000),
- + make_float4(757.0, 0.0002, 0.0001, 0.0000),
- + make_float4(758.0, 0.0002, 0.0001, 0.0000),
- + make_float4(759.0, 0.0002, 0.0001, 0.0000),
- + make_float4(760.0, 0.0002, 0.0001, 0.0000),
- + make_float4(761.0, 0.0002, 0.0001, 0.0000),
- + make_float4(762.0, 0.0001, 0.0001, 0.0000),
- + make_float4(763.0, 0.0001, 0.0000, 0.0000),
- + make_float4(764.0, 0.0001, 0.0000, 0.0000),
- + make_float4(765.0, 0.0001, 0.0000, 0.0000),
- + make_float4(766.0, 0.0001, 0.0000, 0.0000),
- + make_float4(767.0, 0.0001, 0.0000, 0.0000),
- + make_float4(768.0, 0.0001, 0.0000, 0.0000),
- + make_float4(769.0, 0.0001, 0.0000, 0.0000),
- + make_float4(770.0, 0.0001, 0.0000, 0.0000),
- + make_float4(771.0, 0.0001, 0.0000, 0.0000),
- + make_float4(772.0, 0.0001, 0.0000, 0.0000),
- + make_float4(773.0, 0.0001, 0.0000, 0.0000),
- + make_float4(774.0, 0.0001, 0.0000, 0.0000),
- + make_float4(775.0, 0.0001, 0.0000, 0.0000),
- + make_float4(776.0, 0.0001, 0.0000, 0.0000),
- + make_float4(777.0, 0.0001, 0.0000, 0.0000),
- + make_float4(778.0, 0.0000, 0.0000, 0.0000),
- + make_float4(779.0, 0.0000, 0.0000, 0.0000),
- + make_float4(780.0, 0.0000, 0.0000, 0.0000)
- + };
- + int lower_bound = int(wavelength) - 380;
- + int upper_bound = lower_bound + 1;
- + float progress = wavelength - int(wavelength);
- + return make_float3(
- + float_lerp(lookup[lower_bound][1], lookup[upper_bound][1], progress),
- + float_lerp(lookup[lower_bound][2], lookup[upper_bound][2], progress),
- + float_lerp(lookup[lower_bound][3], lookup[upper_bound][3], progress)
- + );
- +}
- +
- +ccl_device float3 find_position_in_lookup(float4 lookup[], float wavelength)
- +{
- + int upper_bound = 0;
- + while(lookup[upper_bound][0] < wavelength) {
- + upper_bound++;
- + }
- + int lower_bound = upper_bound -1;
- + float progress = (wavelength - lookup[lower_bound][0]) / (lookup[upper_bound][0] - lookup[lower_bound][0]);
- + return make_float3(
- + float_lerp(lookup[lower_bound][1], lookup[upper_bound][1], progress),
- + float_lerp(lookup[lower_bound][2], lookup[upper_bound][2], progress),
- + float_lerp(lookup[lower_bound][3], lookup[upper_bound][3], progress)
- + );
- +}
- +
- +ccl_device float find_position_in_lookup_2d(float2 lookup[], float wavelength)
- +{
- + int upper_bound = 0;
- + while(lookup[upper_bound][0] < wavelength) {
- + upper_bound++;
- + }
- + int lower_bound = upper_bound -1;
- + float progress = (wavelength - lookup[lower_bound][0]) / (lookup[upper_bound][0] - lookup[lower_bound][0]);
- + return float_lerp(lookup[lower_bound][1], lookup[upper_bound][1], progress);
- +}
- +
- +ccl_device float get_d65_intensity(float wavelength) {
- + float2 a_lookup[] = {
- + make_float2(300.0, 0.003556865),
- + make_float2(305.0, 0.004312696),
- + make_float2(310.0, 0.005189907),
- + make_float2(315.0, 0.006200985),
- + make_float2(320.0, 0.007358812),
- + make_float2(325.0, 0.008676539),
- + make_float2(330.0, 0.010167392),
- + make_float2(335.0, 0.011844749),
- + make_float2(340.0, 0.013721913),
- + make_float2(345.0, 0.015812112),
- + make_float2(350.0, 0.018128225),
- + make_float2(355.0, 0.020682946),
- + make_float2(360.0, 0.023488429),
- + make_float2(365.0, 0.026556372),
- + make_float2(370.0, 0.029897898),
- + make_float2(375.0, 0.033523444),
- + make_float2(380.0, 0.037442757),
- + make_float2(385.0, 0.041664819),
- + make_float2(390.0, 0.046197277),
- + make_float2(395.0, 0.051048157),
- + make_float2(400.0, 0.056222812),
- + make_float2(405.0, 0.061727357),
- + make_float2(410.0, 0.067565615),
- + make_float2(415.0, 0.073740644),
- + make_float2(420.0, 0.080255503),
- + make_float2(425.0, 0.087110573),
- + make_float2(430.0, 0.094307001),
- + make_float2(435.0, 0.10184364),
- + make_float2(440.0, 0.109718962),
- + make_float2(445.0, 0.117930291),
- + make_float2(450.0, 0.126474186),
- + make_float2(455.0, 0.13534606),
- + make_float2(460.0, 0.144540562),
- + make_float2(465.0, 0.154051575),
- + make_float2(470.0, 0.163872218),
- + make_float2(475.0, 0.173994847),
- + make_float2(480.0, 0.184411052),
- + make_float2(485.0, 0.195112423),
- + make_float2(490.0, 0.206088638),
- + make_float2(495.0, 0.21732976),
- + make_float2(500.0, 0.228825085),
- + make_float2(505.0, 0.24056391),
- + make_float2(510.0, 0.252534384),
- + make_float2(515.0, 0.264724658),
- + make_float2(520.0, 0.277122881),
- + make_float2(525.0, 0.289716057),
- + make_float2(530.0, 0.302492336),
- + make_float2(535.0, 0.315438338),
- + make_float2(540.0, 0.328541066),
- + make_float2(545.0, 0.341787907),
- + make_float2(550.0, 0.35516548),
- + make_float2(555.0, 0.368660408),
- + make_float2(560.0, 0.382260074),
- + make_float2(565.0, 0.39595263),
- + make_float2(570.0, 0.409721638),
- + make_float2(575.0, 0.42355563),
- + make_float2(580.0, 0.437443139),
- + make_float2(585.0, 0.451372696),
- + make_float2(590.0, 0.465329011),
- + make_float2(595.0, 0.479300617),
- + make_float2(600.0, 0.493279868),
- + make_float2(605.0, 0.507247651),
- + make_float2(610.0, 0.521196321),
- + make_float2(615.0, 0.535118233),
- + make_float2(620.0, 0.548994274),
- + make_float2(625.0, 0.562820621),
- + make_float2(630.0, 0.576585806),
- + make_float2(635.0, 0.590278362),
- + make_float2(640.0, 0.603890643),
- + make_float2(645.0, 0.617411182),
- + make_float2(650.0, 0.630836156),
- + make_float2(655.0, 0.644146451),
- + make_float2(660.0, 0.657345892),
- + make_float2(665.0, 0.670419186),
- + make_float2(670.0, 0.683362513),
- + make_float2(675.0, 0.696164402),
- + make_float2(680.0, 0.708821033),
- + make_float2(685.0, 0.721328583),
- + make_float2(690.0, 0.733675584),
- + make_float2(695.0, 0.745858212),
- + make_float2(700.0, 0.757872646),
- + make_float2(705.0, 0.769715063),
- + make_float2(710.0, 0.781373996),
- + make_float2(715.0, 0.792849443),
- + make_float2(720.0, 0.804141406),
- + make_float2(725.0, 0.815238416),
- + make_float2(730.0, 0.826140473),
- + make_float2(735.0, 0.836843755),
- + make_float2(740.0, 0.847344439),
- + make_float2(745.0, 0.857642526),
- + make_float2(750.0, 0.867730369),
- + make_float2(755.0, 0.877611792),
- + make_float2(760.0, 0.887282972),
- + make_float2(765.0, 0.896740086),
- + make_float2(770.0, 0.905986957),
- + make_float2(775.0, 0.91501594),
- + make_float2(780.0, 0.923827035),
- + make_float2(785.0, 0.932424064),
- + make_float2(790.0, 0.940803205),
- + make_float2(795.0, 0.948964457),
- + make_float2(800.0, 0.956907822),
- + make_float2(805.0, 0.964633298),
- + make_float2(810.0, 0.972140886),
- + make_float2(815.0, 0.979430585),
- + make_float2(820.0, 0.986502397),
- + make_float2(825.0, 0.993360143),
- + make_float2(830.0, 1)
- + };
- + float2 d65_lookup[] = {
- + make_float2(300.0, 0.000289444),
- + make_float2(305.0, 0.014126744),
- + make_float2(310.0, 0.027964044),
- + make_float2(315.0, 0.09986419),
- + make_float2(320.0, 0.171765185),
- + make_float2(325.0, 0.243139069),
- + make_float2(330.0, 0.314513802),
- + make_float2(335.0, 0.326801175),
- + make_float2(340.0, 0.339089397),
- + make_float2(345.0, 0.360151767),
- + make_float2(350.0, 0.381214987),
- + make_float2(355.0, 0.388542763),
- + make_float2(360.0, 0.39587054),
- + make_float2(365.0, 0.419004006),
- + make_float2(370.0, 0.442137473),
- + make_float2(375.0, 0.43316725),
- + make_float2(380.0, 0.424197026),
- + make_float2(385.0, 0.444027773),
- + make_float2(390.0, 0.463859369),
- + make_float2(395.0, 0.58314518),
- + make_float2(400.0, 0.702431841),
- + make_float2(405.0, 0.73948664),
- + make_float2(410.0, 0.776542288),
- + make_float2(415.0, 0.78480036),
- + make_float2(420.0, 0.793058432),
- + make_float2(425.0, 0.764412793),
- + make_float2(430.0, 0.735768003),
- + make_float2(435.0, 0.812935864),
- + make_float2(440.0, 0.890104573),
- + make_float2(445.0, 0.941635827),
- + make_float2(450.0, 0.993175568),
- + make_float2(455.0, 0.996587784),
- + make_float2(460.0, 1),
- + make_float2(465.0, 0.987471565),
- + make_float2(470.0, 0.974951618),
- + make_float2(475.0, 0.979458799),
- + make_float2(480.0, 0.98396598),
- + make_float2(485.0, 0.953782297),
- + make_float2(490.0, 0.923598615),
- + make_float2(495.0, 0.92589889),
- + make_float2(500.0, 0.928207653),
- + make_float2(505.0, 0.921620888),
- + make_float2(510.0, 0.915034122),
- + make_float2(515.0, 0.902251044),
- + make_float2(520.0, 0.889467966),
- + make_float2(525.0, 0.901767222),
- + make_float2(530.0, 0.914074967),
- + make_float2(535.0, 0.900137507),
- + make_float2(540.0, 0.886200048),
- + make_float2(545.0, 0.88467219),
- + make_float2(550.0, 0.88315282),
- + make_float2(555.0, 0.865981394),
- + make_float2(560.0, 0.848809968),
- + make_float2(565.0, 0.833252131),
- + make_float2(570.0, 0.817694293),
- + make_float2(575.0, 0.815376193),
- + make_float2(580.0, 0.813058093),
- + make_float2(585.0, 0.782915153),
- + make_float2(590.0, 0.752772213),
- + make_float2(595.0, 0.758376906),
- + make_float2(600.0, 0.763981598),
- + make_float2(605.0, 0.762253421),
- + make_float2(610.0, 0.760526092),
- + make_float2(615.0, 0.7524607),
- + make_float2(620.0, 0.744395308),
- + make_float2(625.0, 0.725678199),
- + make_float2(630.0, 0.706961939),
- + make_float2(635.0, 0.708704546),
- + make_float2(640.0, 0.710447153),
- + make_float2(645.0, 0.694861304),
- + make_float2(650.0, 0.679275456),
- + make_float2(655.0, 0.680072488),
- + make_float2(660.0, 0.680869521),
- + make_float2(665.0, 0.689625845),
- + make_float2(670.0, 0.698382168),
- + make_float2(675.0, 0.681433131),
- + make_float2(680.0, 0.664484093),
- + make_float2(685.0, 0.628142295),
- + make_float2(690.0, 0.591801345),
- + make_float2(695.0, 0.599813262),
- + make_float2(700.0, 0.607825179),
- + make_float2(705.0, 0.619453027),
- + make_float2(710.0, 0.631081723),
- + make_float2(715.0, 0.576991308),
- + make_float2(720.0, 0.522900893),
- + make_float2(725.0, 0.558048416),
- + make_float2(730.0, 0.593195939),
- + make_float2(735.0, 0.61527094),
- + make_float2(740.0, 0.637345941),
- + make_float2(745.0, 0.588563134),
- + make_float2(750.0, 0.539781177),
- + make_float2(755.0, 0.466891318),
- + make_float2(760.0, 0.394002309),
- + make_float2(765.0, 0.480526602),
- + make_float2(770.0, 0.567050895),
- + make_float2(775.0, 0.55252521),
- + make_float2(780.0, 0.537999525),
- + make_float2(785.0, 0.541909143),
- + make_float2(790.0, 0.545818762),
- + make_float2(795.0, 0.525225783),
- + make_float2(800.0, 0.504633654),
- + make_float2(805.0, 0.472832988),
- + make_float2(810.0, 0.441033171),
- + make_float2(815.0, 0.464297355),
- + make_float2(820.0, 0.487561539),
- + make_float2(825.0, 0.499749601),
- + make_float2(830.0, 0.511938512)
- + };
- + return find_position_in_lookup_2d(d65_lookup, wavelength);
- +
- +}
- +ccl_device float3 get_d65_intensities(float3 wavelengths) {
- + return make_float3(
- + get_d65_intensity(wavelengths[0]),
- + get_d65_intensity(wavelengths[1]),
- + get_d65_intensity(wavelengths[2])
- + );
- +}
- +
- +ccl_device float3 rec709_to_wavelength_intensities(float3 rgb, float3 wavelengths)
- +{
- + float4 lookup[] = {
- + make_float4(380.0, 0.021592459, 0.010542406, 0.967865135),
- + make_float4(390.0, 0.020293111, 0.010878976, 0.968827912),
- + make_float4(400.0, 0.021807906, 0.011063512, 0.967128582),
- + make_float4(410.0, 0.023803297, 0.010736566, 0.965460137),
- + make_float4(420.0, 0.025208132, 0.011681813, 0.963110055),
- + make_float4(430.0, 0.025414957, 0.012434719, 0.962150324),
- + make_float4(440.0, 0.024621282, 0.014986907, 0.960391811),
- + make_float4(450.0, 0.020973705, 0.020100392, 0.958925903),
- + make_float4(460.0, 0.015752802, 0.030356263, 0.953890935),
- + make_float4(470.0, 0.01116804, 0.063388962, 0.925442998),
- + make_float4(480.0, 0.008578277, 0.173423837, 0.817997886),
- + make_float4(490.0, 0.006581877, 0.568321142, 0.42509696),
- + make_float4(500.0, 0.005171723, 0.827791998, 0.167036273),
- + make_float4(510.0, 0.004545205, 0.916560468, 0.078894327),
- + make_float4(520.0, 0.00414512, 0.952002841, 0.043852038),
- + make_float4(530.0, 0.004343112, 0.964096452, 0.031560435),
- + make_float4(540.0, 0.005238155, 0.970590861, 0.024170984),
- + make_float4(550.0, 0.007251939, 0.972502542, 0.020245519),
- + make_float4(560.0, 0.012543656, 0.969148203, 0.01830814),
- + make_float4(570.0, 0.028067132, 0.955344651, 0.016588218),
- + make_float4(580.0, 0.091342277, 0.892637233, 0.01602049),
- + make_float4(590.0, 0.484081092, 0.5003641, 0.015554808),
- + make_float4(600.0, 0.870378324, 0.116236717, 0.013384959),
- + make_float4(610.0, 0.939513128, 0.047951391, 0.012535491),
- + make_float4(620.0, 0.960926994, 0.027873526, 0.011199484),
- + make_float4(630.0, 0.968623763, 0.020057963, 0.011318274),
- + make_float4(640.0, 0.971263883, 0.017382174, 0.011353953),
- + make_float4(650.0, 0.972285819, 0.015429109, 0.012285073),
- + make_float4(660.0, 0.971898742, 0.01543808, 0.012663188),
- + make_float4(670.0, 0.972691859, 0.014546826, 0.012761325),
- + make_float4(680.0, 0.971734812, 0.015197773, 0.013067426),
- + make_float4(690.0, 0.97234454, 0.014285896, 0.013369566),
- + make_float4(700.0, 0.97150339, 0.015069123, 0.013427487),
- + make_float4(710.0, 0.970857997, 0.015506263, 0.01363574),
- + make_float4(720.0, 0.970553866, 0.015545797, 0.013893597),
- + make_float4(730.0, 0.969671404, 0.016302839, 0.014025757),
- +
- + };
- + // find position in lookup of first wavelength
- + float3 wavelength_one_magnitudes = find_position_in_lookup(lookup, wavelengths[0]);
- + // multiply the lookups by the RGB factors
- + float3 contributions_one = wavelength_one_magnitudes * rgb;
- + // add the three components
- + float wavelength_one_brightness = contributions_one[0] + contributions_one[1] + contributions_one[2];
- +
- + // repeat for other two wavelengths
- + float3 wavelength_two_magnitudes = find_position_in_lookup(lookup, wavelengths[1]);
- + float3 contributions_two = wavelength_two_magnitudes * rgb;
- + float wavelength_two_brightness = contributions_two[0] + contributions_two[1] + contributions_two[2];
- +
- + float3 wavelength_three_magnitudes = find_position_in_lookup(lookup, wavelengths[2]);
- + float3 contributions_three = wavelength_three_magnitudes * rgb;
- + float wavelength_three_brightness = contributions_three[0] + contributions_three[1] + contributions_three[2];
- +
- + return make_float3(
- + wavelength_one_brightness,
- + wavelength_two_brightness,
- + wavelength_three_brightness
- + );
- +}
- +
- +ccl_device float3 xyz_to_rec709(float3 xyz)
- +{
- + float red = (3.2404542 * xyz[0]) + (-1.5371385 * xyz[1]) + (-0.4985314 * xyz[2]);
- + float green = (-0.9692660 * xyz[0]) + (1.8760108 * xyz[1]) + (0.0415560 * xyz[2]);
- + float blue = (0.0556434 * xyz[0]) + (-0.2040259 * xyz[1]) + (1.0572252 * xyz[2]);
- + return make_float3(red, green, blue);
- +}
- +
- CCL_NAMESPACE_END
- #endif /* __KERNEL_COLOR_H__ */
- diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
- index 302bb047647..f05dcc81252 100644
- --- a/intern/cycles/kernel/kernel_emission.h
- +++ b/intern/cycles/kernel/kernel_emission.h
- @@ -74,7 +74,7 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
- path_state_modify_bounce(state, false);
- /* Evaluate emissive closure. */
- - eval = shader_emissive_eval(kg, emission_sd);
- + eval = shader_emissive_eval(kg, emission_sd, state->wavelengths);
- }
- eval *= ls->eval_fac;
- @@ -116,7 +116,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
- #ifdef __VOLUME__
- if(sd->prim != PRIM_NONE)
- - shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS);
- + shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS, state->wavelengths);
- else {
- float bsdf_pdf;
- shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
- @@ -127,7 +127,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
- }
- }
- #else
- - shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS);
- + shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS, state->wavelengths);
- #endif
- bsdf_eval_mul3(eval, light_eval/ls->pdf);
- @@ -198,10 +198,10 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
- /* Indirect Primitive Emission */
- -ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf)
- +ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf, float3 wavelengths)
- {
- /* evaluate emissive closure */
- - float3 L = shader_emissive_eval(kg, sd);
- + float3 L = shader_emissive_eval(kg, sd, wavelengths);
- #ifdef __HAIR__
- if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_USE_MIS) && (sd->type & PRIMITIVE_ALL_TRIANGLE))
- diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
- index 458aa6c2a97..43473c4dbc9 100644
- --- a/intern/cycles/kernel/kernel_passes.h
- +++ b/intern/cycles/kernel/kernel_passes.h
- @@ -335,12 +335,20 @@ ccl_device_inline void kernel_write_light_passes(KernelGlobals *kg, ccl_global f
- ccl_device_inline void kernel_write_result(KernelGlobals *kg,
- ccl_global float *buffer,
- int sample,
- - PathRadiance *L)
- + PathRadiance *L,
- + float3 wavelengths)
- {
- float alpha;
- float3 L_sum = path_radiance_clamp_and_sum(kg, L, &alpha);
- - kernel_write_pass_float4(buffer, make_float4(L_sum.x, L_sum.y, L_sum.z, alpha));
- + // convert L_sum to RGB based on wavelengths
- + float3 channel1_xyz = wavelength_to_xyz(wavelengths[0]) * L_sum[0];
- + float3 channel2_xyz = wavelength_to_xyz(wavelengths[1]) * L_sum[1];
- + float3 channel3_xyz = wavelength_to_xyz(wavelengths[2]) * L_sum[2];
- + float3 combined_xyz = channel1_xyz + channel2_xyz + channel3_xyz;
- + float3 combined_rgb = xyz_to_rec709(combined_xyz);
- +
- + kernel_write_pass_float4(buffer, make_float4(combined_rgb[0], combined_rgb[1], combined_rgb[2], alpha));
- kernel_write_light_passes(kg, buffer, L);
- diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
- index 5745762e183..4ea012288f1 100644
- --- a/intern/cycles/kernel/kernel_path.h
- +++ b/intern/cycles/kernel/kernel_path.h
- @@ -339,7 +339,8 @@ ccl_device_forceinline bool kernel_path_shader_apply(
- #ifdef __EMISSION__
- /* emission */
- if(sd->flag & SD_EMISSION) {
- - float3 emission = indirect_primitive_emission(kg, sd, sd->ray_length, state->flag, state->ray_pdf);
- + float3 emission = indirect_primitive_emission(kg, sd, sd->ray_length, state->flag, state->ray_pdf, state->wavelengths);
- + // float3 wavelength_intensities = rec709_to_wavelength_intensities(emission, state->wavelengths);
- path_radiance_accum_emission(L, state, throughput, emission);
- }
- #endif /* __EMISSION__ */
- @@ -717,7 +718,7 @@ ccl_device_forceinline void kernel_path_integrate(
- ccl_device void kernel_path_trace(KernelGlobals *kg,
- ccl_global float *buffer,
- - int sample, int x, int y, int offset, int stride)
- + int sample, int x, int y, int offset, int stride, float3 wavelengths)
- {
- /* buffer offset */
- int index = offset + x + y*stride;
- @@ -756,7 +757,7 @@ ccl_device void kernel_path_trace(KernelGlobals *kg,
- buffer,
- emission_sd);
- - kernel_write_result(kg, buffer, sample, &L);
- + kernel_write_result(kg, buffer, sample, &L, state.wavelengths);
- }
- #endif /* __SPLIT_KERNEL__ */
- diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h
- index 80fcf5b0565..470eb40501f 100644
- --- a/intern/cycles/kernel/kernel_path_branched.h
- +++ b/intern/cycles/kernel/kernel_path_branched.h
- @@ -591,7 +591,7 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg,
- ccl_device void kernel_branched_path_trace(KernelGlobals *kg,
- ccl_global float *buffer,
- - int sample, int x, int y, int offset, int stride)
- + int sample, int x, int y, int offset, int stride, float3 wavelengths)
- {
- /* buffer offset */
- int index = offset + x + y*stride;
- @@ -610,7 +610,7 @@ ccl_device void kernel_branched_path_trace(KernelGlobals *kg,
- if(ray.t != 0.0f) {
- kernel_branched_path_integrate(kg, rng_hash, sample, ray, buffer, &L);
- - kernel_write_result(kg, buffer, sample, &L);
- + kernel_write_result(kg, buffer, sample, &L, wavelengths);
- }
- }
- diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h
- index e85050df4bb..bbfc22ed9e4 100644
- --- a/intern/cycles/kernel/kernel_path_state.h
- +++ b/intern/cycles/kernel/kernel_path_state.h
- @@ -36,6 +36,12 @@ ccl_device_inline void path_state_init(KernelGlobals *kg,
- state->glossy_bounce = 0;
- state->transmission_bounce = 0;
- state->transparent_bounce = 0;
- +
- + state->wavelengths = make_float3(
- + (path_state_rng_1D(kg, state, 1 ) * 350) + 380,
- + (path_state_rng_1D(kg, state, 2 ) * 350) + 380,
- + (path_state_rng_1D(kg, state, 3 ) * 350) + 380
- + );
- #ifdef __DENOISING_FEATURES__
- if(kernel_data.film.pass_denoising_data) {
- diff --git a/intern/cycles/kernel/kernel_path_surface.h b/intern/cycles/kernel/kernel_path_surface.h
- index c9202ccb16d..d794c9062fa 100644
- --- a/intern/cycles/kernel/kernel_path_surface.h
- +++ b/intern/cycles/kernel/kernel_path_surface.h
- @@ -286,7 +286,7 @@ ccl_device bool kernel_path_surface_bounce(KernelGlobals *kg,
- int label;
- label = shader_bsdf_sample(kg, sd, bsdf_u, bsdf_v, &bsdf_eval,
- - &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
- + &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf, state->wavelengths);
- if(bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval))
- return false;
- diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
- index e834b701f96..b8c9e01de61 100644
- --- a/intern/cycles/kernel/kernel_shader.h
- +++ b/intern/cycles/kernel/kernel_shader.h
- @@ -529,8 +529,15 @@ ccl_device_inline void shader_prepare_closures(ShaderData *sd,
- /* BSDF */
- -ccl_device_inline void _shader_bsdf_multi_eval(KernelGlobals *kg, ShaderData *sd, const float3 omega_in, float *pdf,
- - const ShaderClosure *skip_sc, BsdfEval *result_eval, float sum_pdf, float sum_sample_weight)
- +ccl_device_inline void _shader_bsdf_multi_eval( KernelGlobals *kg,
- + ShaderData *sd,
- + const float3 omega_in,
- + float *pdf,
- + const ShaderClosure *skip_sc,
- + BsdfEval *result_eval,
- + float sum_pdf,
- + float sum_sample_weight,
- + float3 wavelengths)
- {
- /* this is the veach one-sample model with balance heuristic, some pdf
- * factors drop out when using balance heuristic weighting */
- @@ -542,7 +549,10 @@ ccl_device_inline void _shader_bsdf_multi_eval(KernelGlobals *kg, ShaderData *sd
- float3 eval = bsdf_eval(kg, sd, sc, omega_in, &bsdf_pdf);
- if(bsdf_pdf != 0.0f) {
- - bsdf_eval_accum(result_eval, sc->type, eval*sc->weight, 1.0f);
- + // rgb to spectrum
- + float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
- +
- + bsdf_eval_accum(result_eval, sc->type, eval * wavelength_intensities, 1.0f);
- sum_pdf += bsdf_pdf*sc->sample_weight;
- }
- @@ -589,7 +599,8 @@ void shader_bsdf_eval(KernelGlobals *kg,
- const float3 omega_in,
- BsdfEval *eval,
- float light_pdf,
- - bool use_mis)
- + bool use_mis,
- + float3 wavelengths)
- {
- bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
- @@ -600,7 +611,7 @@ void shader_bsdf_eval(KernelGlobals *kg,
- #endif
- {
- float pdf;
- - _shader_bsdf_multi_eval(kg, sd, omega_in, &pdf, NULL, eval, 0.0f, 0.0f);
- + _shader_bsdf_multi_eval(kg, sd, omega_in, &pdf, NULL, eval, 0.0f, 0.0f, wavelengths);
- if(use_mis) {
- float weight = power_heuristic(light_pdf, pdf);
- bsdf_eval_mis(eval, weight);
- @@ -718,7 +729,8 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
- BsdfEval *bsdf_eval,
- float3 *omega_in,
- differential3 *domega_in,
- - float *pdf)
- + float *pdf,
- + float3 wavelengths)
- {
- const ShaderClosure *sc = shader_bsdf_pick(sd, &randu);
- if(sc == NULL) {
- @@ -734,13 +746,14 @@ ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
- *pdf = 0.0f;
- label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
- + // float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
- if(*pdf != 0.0f) {
- - bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
- + bsdf_eval_init(bsdf_eval, sc->type, eval * sc->weight, kernel_data.film.use_light_pass);
- if(sd->num_closure > 1) {
- float sweight = sc->sample_weight;
- - _shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sc, bsdf_eval, *pdf*sweight, sweight);
- + _shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sc, bsdf_eval, *pdf*sweight, sweight, wavelengths);
- }
- }
- @@ -757,8 +770,10 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, ShaderData *sd,
- *pdf = 0.0f;
- label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
- + // float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
- +
- if(*pdf != 0.0f)
- - bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
- + bsdf_eval_init(bsdf_eval, sc->type, eval * sc->weight, kernel_data.film.use_light_pass);
- return label;
- }
- @@ -953,10 +968,12 @@ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_b
- /* Emission */
- -ccl_device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd)
- +// bookmark: This might need to be converted to wavelength intensities
- +ccl_device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd, float3 wavelengths)
- {
- if(sd->flag & SD_EMISSION) {
- - return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background;
- + float3 wavelength_intensities = rec709_to_wavelength_intensities(sd->closure_emission_background, wavelengths);
- + return emissive_simple_eval(sd->Ng, sd->I) * wavelength_intensities;
- }
- else {
- return make_float3(0.0f, 0.0f, 0.0f);
- @@ -1024,6 +1041,7 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
- /* Background Evaluation */
- +// bookmark: This might need to be converted to wavelength intensities
- ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
- ccl_addr_space PathState *state, int path_flag)
- {
- @@ -1042,7 +1060,9 @@ ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
- }
- if(sd->flag & SD_EMISSION) {
- - return sd->closure_emission_background;
- + float3 wavelength_intensities = rec709_to_wavelength_intensities(sd->closure_emission_background, state->wavelengths);
- + wavelength_intensities *= get_d65_intensities(state->wavelengths);
- + return wavelength_intensities;
- }
- else {
- return make_float3(0.0f, 0.0f, 0.0f);
- diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h
- index a06fbe72ffa..ba7d2efe127 100644
- --- a/intern/cycles/kernel/kernel_subsurface.h
- +++ b/intern/cycles/kernel/kernel_subsurface.h
- @@ -26,7 +26,8 @@ ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd,
- const ShaderClosure *sc,
- float disk_r,
- float r,
- - bool all)
- + bool all,
- + float3 wavelengths)
- {
- /* this is the veach one-sample model with balance heuristic, some pdf
- * factors drop out when using balance heuristic weighting */
- @@ -60,6 +61,8 @@ ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd,
- float3 eval = bssrdf_eval(sc, r);
- float pdf = bssrdf_pdf(sc, disk_r);
- + // float3 wavelength_intensities = rec709_to_wavelength_intensities(sc->weight, wavelengths);
- +
- eval_sum += sc->weight * eval;
- pdf_sum += sample_weight * pdf;
- }
- @@ -173,7 +176,8 @@ ccl_device_inline int subsurface_scatter_disk(
- uint *lcg_state,
- float disk_u,
- float disk_v,
- - bool all)
- + bool all,
- + float3 wavelengths)
- {
- /* pick random axis in local frame and point on disk */
- float3 disk_N, disk_T, disk_B;
- @@ -291,7 +295,7 @@ ccl_device_inline int subsurface_scatter_disk(
- float r = len(hit_P - sd->P);
- /* Evaluate profiles. */
- - float3 eval = subsurface_scatter_eval(sd, sc, disk_r, r, all) * w;
- + float3 eval = subsurface_scatter_eval(sd, sc, disk_r, r, all, wavelengths) * w;
- ss_isect->weight[hit] = eval;
- }
- @@ -519,7 +523,8 @@ ccl_device_inline int subsurface_scatter_multi_intersect(
- lcg_state,
- bssrdf_u,
- bssrdf_v,
- - all);
- + all,
- + state->wavelengths);
- }
- else {
- return subsurface_random_walk(kg,
- diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
- index e93100a6442..0828c2c33c9 100644
- --- a/intern/cycles/kernel/kernel_types.h
- +++ b/intern/cycles/kernel/kernel_types.h
- @@ -1090,6 +1090,8 @@ typedef struct PathState {
- int transmission_bounce;
- int transparent_bounce;
- + float3 wavelengths;
- +
- #ifdef __DENOISING_FEATURES__
- float denoising_feature_weight;
- #endif /* __DENOISING_FEATURES__ */
- diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
- index 5ec1655ab05..11dab26464e 100644
- --- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
- +++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
- @@ -83,19 +83,23 @@ void KERNEL_FUNCTION_FULL_NAME(path_trace)(KernelGlobals *kg,
- #ifdef KERNEL_STUB
- STUB_ASSERT(KERNEL_ARCH, path_trace);
- #else
- + float3 wavelengths = make_float3(0.0, 0.0, 0.0);
- # ifdef __BRANCHED_PATH__
- if(kernel_data.integrator.branched) {
- +
- + // remove this once it is working:
- kernel_branched_path_trace(kg,
- buffer,
- sample,
- x, y,
- offset,
- - stride);
- + stride,
- + wavelengths);
- }
- else
- # endif
- {
- - kernel_path_trace(kg, buffer, sample, x, y, offset, stride);
- + kernel_path_trace(kg, buffer, sample, x, y, offset, stride, wavelengths);
- }
- #endif /* KERNEL_STUB */
- }
- diff --git a/intern/cycles/kernel/split/kernel_buffer_update.h b/intern/cycles/kernel/split/kernel_buffer_update.h
- index 180c0b57077..6f27fbe6854 100644
- --- a/intern/cycles/kernel/split/kernel_buffer_update.h
- +++ b/intern/cycles/kernel/split/kernel_buffer_update.h
- @@ -87,7 +87,7 @@ ccl_device void kernel_buffer_update(KernelGlobals *kg,
- ccl_global float *buffer = kernel_split_params.tile.buffer + buffer_offset;
- /* accumulate result in output buffer */
- - kernel_write_result(kg, buffer, sample, L);
- + kernel_write_result(kg, buffer, sample, L, state->wavelengths);
- ASSIGN_RAY_STATE(ray_state, ray_index, RAY_TO_REGENERATE);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement