forked from bartvdbraak/blender
Cycles: Code cleanyp, sky model
For as long as code stays in official folders it should follow our code style.
This commit is contained in:
parent
5ff132182d
commit
e1bcc2d779
@ -4,7 +4,7 @@ This source is published under the following 3-clause BSD license.
|
||||
Copyright (c) 2012 - 2013, Lukas Hosek and Alexander Wilkie
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
@ -12,8 +12,8 @@ modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* None of the names of the contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
* None of the names of the contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
@ -40,24 +40,24 @@ and the 2013 IEEE CG&A paper
|
||||
|
||||
"Adding a Solar Radiance Function to the Hosek Skylight Model"
|
||||
|
||||
both by
|
||||
both by
|
||||
|
||||
Lukas Hosek and Alexander Wilkie
|
||||
Charles University in Prague, Czech Republic
|
||||
|
||||
|
||||
Version: 1.4a, February 22nd, 2013
|
||||
|
||||
|
||||
Version history:
|
||||
|
||||
1.4a February 22nd, 2013
|
||||
Removed unnecessary and counter-intuitive solar radius parameters
|
||||
Removed unnecessary and counter-intuitive solar radius parameters
|
||||
from the interface of the colourspace sky dome initialisation functions.
|
||||
|
||||
1.4 February 11th, 2013
|
||||
Fixed a bug which caused the relative brightness of the solar disc
|
||||
and the sky dome to be off by a factor of about 6. The sun was too
|
||||
bright: this affected both normal and alien sun scenarios. The
|
||||
and the sky dome to be off by a factor of about 6. The sun was too
|
||||
bright: this affected both normal and alien sun scenarios. The
|
||||
coefficients of the solar radiance function were changed to fix this.
|
||||
|
||||
1.3 January 21st, 2013 (not released to the public)
|
||||
@ -81,7 +81,7 @@ Version history:
|
||||
the result of a simple conversion from spectral data via the CIE 2 degree
|
||||
standard observer matching functions. Therefore, after multiplication
|
||||
with 683 lm / W, the Y channel now corresponds to luminance in lm.
|
||||
|
||||
|
||||
1.0 May 11th, 2012
|
||||
Initial release.
|
||||
|
||||
@ -110,7 +110,7 @@ CCL_NAMESPACE_BEGIN
|
||||
// Some macro definitions that occur elsewhere in ART, and that have to be
|
||||
// replicated to make this a stand-alone module.
|
||||
|
||||
#ifndef MATH_PI
|
||||
#ifndef MATH_PI
|
||||
#define MATH_PI 3.141592653589793
|
||||
#endif
|
||||
|
||||
@ -138,250 +138,231 @@ typedef const double *ArHosekSkyModel_Radiance_Dataset;
|
||||
// internal functions
|
||||
|
||||
static void ArHosekSkyModel_CookConfiguration(
|
||||
ArHosekSkyModel_Dataset dataset,
|
||||
ArHosekSkyModelConfiguration config,
|
||||
double turbidity,
|
||||
double albedo,
|
||||
double solar_elevation
|
||||
)
|
||||
ArHosekSkyModel_Dataset dataset,
|
||||
ArHosekSkyModelConfiguration config,
|
||||
double turbidity,
|
||||
double albedo,
|
||||
double solar_elevation)
|
||||
{
|
||||
const double * elev_matrix;
|
||||
const double * elev_matrix;
|
||||
|
||||
int int_turbidity = (int)turbidity;
|
||||
double turbidity_rem = turbidity - (double)int_turbidity;
|
||||
int int_turbidity = (int)turbidity;
|
||||
double turbidity_rem = turbidity - (double)int_turbidity;
|
||||
|
||||
solar_elevation = pow(solar_elevation / (MATH_PI / 2.0), (1.0 / 3.0));
|
||||
solar_elevation = pow(solar_elevation / (MATH_PI / 2.0), (1.0 / 3.0));
|
||||
|
||||
// alb 0 low turb
|
||||
// alb 0 low turb
|
||||
|
||||
elev_matrix = dataset + ( 9 * 6 * (int_turbidity-1) );
|
||||
|
||||
|
||||
for( unsigned int i = 0; i < 9; ++i )
|
||||
{
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] =
|
||||
(1.0-albedo) * (1.0 - turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
elev_matrix = dataset + ( 9 * 6 * (int_turbidity-1));
|
||||
|
||||
for(unsigned int i = 0; i < 9; ++i) {
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] =
|
||||
(1.0-albedo) * (1.0 - turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
|
||||
// alb 1 low turb
|
||||
elev_matrix = dataset + (9*6*10 + 9*6*(int_turbidity-1));
|
||||
for(unsigned int i = 0; i < 9; ++i)
|
||||
{
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] +=
|
||||
(albedo) * (1.0 - turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
// alb 1 low turb
|
||||
elev_matrix = dataset + (9*6*10 + 9*6*(int_turbidity-1));
|
||||
for(unsigned int i = 0; i < 9; ++i) {
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] +=
|
||||
(albedo) * (1.0 - turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
|
||||
if(int_turbidity == 10)
|
||||
return;
|
||||
if(int_turbidity == 10)
|
||||
return;
|
||||
|
||||
// alb 0 high turb
|
||||
elev_matrix = dataset + (9*6*(int_turbidity));
|
||||
for(unsigned int i = 0; i < 9; ++i)
|
||||
{
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] +=
|
||||
(1.0-albedo) * (turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
// alb 0 high turb
|
||||
elev_matrix = dataset + (9*6*(int_turbidity));
|
||||
for(unsigned int i = 0; i < 9; ++i) {
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] +=
|
||||
(1.0-albedo) * (turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
|
||||
// alb 1 high turb
|
||||
elev_matrix = dataset + (9*6*10 + 9*6*(int_turbidity));
|
||||
for(unsigned int i = 0; i < 9; ++i)
|
||||
{
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] +=
|
||||
(albedo) * (turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
// alb 1 high turb
|
||||
elev_matrix = dataset + (9*6*10 + 9*6*(int_turbidity));
|
||||
for(unsigned int i = 0; i < 9; ++i) {
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
config[i] +=
|
||||
(albedo) * (turbidity_rem)
|
||||
* ( pow(1.0-solar_elevation, 5.0) * elev_matrix[i] +
|
||||
5.0 * pow(1.0-solar_elevation, 4.0) * solar_elevation * elev_matrix[i+9] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[i+18] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[i+27] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[i+36] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[i+45]);
|
||||
}
|
||||
}
|
||||
|
||||
static double ArHosekSkyModel_CookRadianceConfiguration(
|
||||
ArHosekSkyModel_Radiance_Dataset dataset,
|
||||
double turbidity,
|
||||
double albedo,
|
||||
double solar_elevation
|
||||
)
|
||||
ArHosekSkyModel_Radiance_Dataset dataset,
|
||||
double turbidity,
|
||||
double albedo,
|
||||
double solar_elevation)
|
||||
{
|
||||
const double* elev_matrix;
|
||||
const double* elev_matrix;
|
||||
|
||||
int int_turbidity = (int)turbidity;
|
||||
double turbidity_rem = turbidity - (double)int_turbidity;
|
||||
double res;
|
||||
solar_elevation = pow(solar_elevation / (MATH_PI / 2.0), (1.0 / 3.0));
|
||||
int int_turbidity = (int)turbidity;
|
||||
double turbidity_rem = turbidity - (double)int_turbidity;
|
||||
double res;
|
||||
solar_elevation = pow(solar_elevation / (MATH_PI / 2.0), (1.0 / 3.0));
|
||||
|
||||
// alb 0 low turb
|
||||
elev_matrix = dataset + (6*(int_turbidity-1));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res = (1.0-albedo) * (1.0 - turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
// alb 0 low turb
|
||||
elev_matrix = dataset + (6*(int_turbidity-1));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res = (1.0-albedo) * (1.0 - turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
|
||||
// alb 1 low turb
|
||||
elev_matrix = dataset + (6*10 + 6*(int_turbidity-1));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res += (albedo) * (1.0 - turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
if(int_turbidity == 10)
|
||||
return res;
|
||||
// alb 1 low turb
|
||||
elev_matrix = dataset + (6*10 + 6*(int_turbidity-1));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res += (albedo) * (1.0 - turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
if(int_turbidity == 10)
|
||||
return res;
|
||||
|
||||
// alb 0 high turb
|
||||
elev_matrix = dataset + (6*(int_turbidity));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res += (1.0-albedo) * (turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
// alb 0 high turb
|
||||
elev_matrix = dataset + (6*(int_turbidity));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res += (1.0-albedo) * (turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
|
||||
// alb 1 high turb
|
||||
elev_matrix = dataset + (6*10 + 6*(int_turbidity));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res += (albedo) * (turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
return res;
|
||||
// alb 1 high turb
|
||||
elev_matrix = dataset + (6*10 + 6*(int_turbidity));
|
||||
//(1-t).^3* A1 + 3*(1-t).^2.*t * A2 + 3*(1-t) .* t .^ 2 * A3 + t.^3 * A4;
|
||||
res += (albedo) * (turbidity_rem) *
|
||||
( pow(1.0-solar_elevation, 5.0) * elev_matrix[0] +
|
||||
5.0*pow(1.0-solar_elevation, 4.0)*solar_elevation * elev_matrix[1] +
|
||||
10.0*pow(1.0-solar_elevation, 3.0)*pow(solar_elevation, 2.0) * elev_matrix[2] +
|
||||
10.0*pow(1.0-solar_elevation, 2.0)*pow(solar_elevation, 3.0) * elev_matrix[3] +
|
||||
5.0*(1.0-solar_elevation)*pow(solar_elevation, 4.0) * elev_matrix[4] +
|
||||
pow(solar_elevation, 5.0) * elev_matrix[5]);
|
||||
return res;
|
||||
}
|
||||
|
||||
static double ArHosekSkyModel_GetRadianceInternal(
|
||||
ArHosekSkyModelConfiguration configuration,
|
||||
double theta,
|
||||
double gamma
|
||||
)
|
||||
ArHosekSkyModelConfiguration configuration,
|
||||
double theta,
|
||||
double gamma)
|
||||
{
|
||||
const double expM = exp(configuration[4] * gamma);
|
||||
const double rayM = cos(gamma)*cos(gamma);
|
||||
const double mieM = (1.0 + cos(gamma)*cos(gamma)) / pow((1.0 + configuration[8]*configuration[8] - 2.0*configuration[8]*cos(gamma)), 1.5);
|
||||
const double zenith = sqrt(cos(theta));
|
||||
const double expM = exp(configuration[4] * gamma);
|
||||
const double rayM = cos(gamma)*cos(gamma);
|
||||
const double mieM = (1.0 + cos(gamma)*cos(gamma)) / pow((1.0 + configuration[8]*configuration[8] - 2.0*configuration[8]*cos(gamma)), 1.5);
|
||||
const double zenith = sqrt(cos(theta));
|
||||
|
||||
return (1.0 + configuration[0] * exp(configuration[1] / (cos(theta) + 0.01))) *
|
||||
return (1.0 + configuration[0] * exp(configuration[1] / (cos(theta) + 0.01))) *
|
||||
(configuration[2] + configuration[3] * expM + configuration[5] * rayM + configuration[6] * mieM + configuration[7] * zenith);
|
||||
}
|
||||
|
||||
void arhosekskymodelstate_free(
|
||||
ArHosekSkyModelState * state
|
||||
)
|
||||
void arhosekskymodelstate_free(ArHosekSkyModelState * state)
|
||||
{
|
||||
free(state);
|
||||
free(state);
|
||||
}
|
||||
|
||||
double arhosekskymodel_radiance(
|
||||
ArHosekSkyModelState * state,
|
||||
double theta,
|
||||
double gamma,
|
||||
double wavelength
|
||||
)
|
||||
double arhosekskymodel_radiance(ArHosekSkyModelState *state,
|
||||
double theta,
|
||||
double gamma,
|
||||
double wavelength)
|
||||
{
|
||||
int low_wl = (int)((wavelength - 320.0) / 40.0);
|
||||
int low_wl = (int)((wavelength - 320.0) / 40.0);
|
||||
|
||||
if( low_wl < 0 || low_wl >= 11 )
|
||||
return 0.0f;
|
||||
if(low_wl < 0 || low_wl >= 11)
|
||||
return 0.0f;
|
||||
|
||||
double interp = fmod((wavelength - 320.0 ) / 40.0, 1.0);
|
||||
double interp = fmod((wavelength - 320.0 ) / 40.0, 1.0);
|
||||
|
||||
double val_low =
|
||||
ArHosekSkyModel_GetRadianceInternal(
|
||||
state->configs[low_wl],
|
||||
theta,
|
||||
gamma
|
||||
)
|
||||
* state->radiances[low_wl]
|
||||
* state->emission_correction_factor_sky[low_wl];
|
||||
double val_low =
|
||||
ArHosekSkyModel_GetRadianceInternal(
|
||||
state->configs[low_wl],
|
||||
theta,
|
||||
gamma)
|
||||
* state->radiances[low_wl]
|
||||
* state->emission_correction_factor_sky[low_wl];
|
||||
|
||||
if( interp < 1e-6 )
|
||||
return val_low;
|
||||
if(interp < 1e-6)
|
||||
return val_low;
|
||||
|
||||
double result = ( 1.0 - interp ) * val_low;
|
||||
double result = ( 1.0 - interp ) * val_low;
|
||||
|
||||
if( low_wl+1 < 11 )
|
||||
{
|
||||
result +=
|
||||
interp
|
||||
* ArHosekSkyModel_GetRadianceInternal(
|
||||
state->configs[low_wl+1],
|
||||
theta,
|
||||
gamma
|
||||
)
|
||||
* state->radiances[low_wl+1]
|
||||
* state->emission_correction_factor_sky[low_wl+1];
|
||||
}
|
||||
if(low_wl+1 < 11) {
|
||||
result +=
|
||||
interp
|
||||
* ArHosekSkyModel_GetRadianceInternal(
|
||||
state->configs[low_wl+1],
|
||||
theta,
|
||||
gamma)
|
||||
* state->radiances[low_wl+1]
|
||||
* state->emission_correction_factor_sky[low_wl+1];
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// xyz and rgb versions
|
||||
|
||||
ArHosekSkyModelState * arhosek_xyz_skymodelstate_alloc_init(
|
||||
const double turbidity,
|
||||
const double albedo,
|
||||
const double elevation
|
||||
)
|
||||
ArHosekSkyModelState * arhosek_xyz_skymodelstate_alloc_init(
|
||||
const double turbidity,
|
||||
const double albedo,
|
||||
const double elevation)
|
||||
{
|
||||
ArHosekSkyModelState * state = ALLOC(ArHosekSkyModelState);
|
||||
ArHosekSkyModelState * state = ALLOC(ArHosekSkyModelState);
|
||||
|
||||
state->solar_radius = TERRESTRIAL_SOLAR_RADIUS;
|
||||
state->turbidity = turbidity;
|
||||
state->albedo = albedo;
|
||||
state->elevation = elevation;
|
||||
|
||||
for( unsigned int channel = 0; channel < 3; ++channel )
|
||||
{
|
||||
ArHosekSkyModel_CookConfiguration(
|
||||
datasetsXYZ[channel],
|
||||
state->configs[channel],
|
||||
turbidity,
|
||||
albedo,
|
||||
elevation
|
||||
);
|
||||
|
||||
state->radiances[channel] =
|
||||
ArHosekSkyModel_CookRadianceConfiguration(
|
||||
datasetsXYZRad[channel],
|
||||
turbidity,
|
||||
albedo,
|
||||
elevation
|
||||
);
|
||||
state->solar_radius = TERRESTRIAL_SOLAR_RADIUS;
|
||||
state->turbidity = turbidity;
|
||||
state->albedo = albedo;
|
||||
state->elevation = elevation;
|
||||
|
||||
for(unsigned int channel = 0; channel < 3; ++channel) {
|
||||
ArHosekSkyModel_CookConfiguration(
|
||||
datasetsXYZ[channel],
|
||||
state->configs[channel],
|
||||
turbidity,
|
||||
albedo,
|
||||
elevation);
|
||||
|
||||
state->radiances[channel] =
|
||||
ArHosekSkyModel_CookRadianceConfiguration(
|
||||
datasetsXYZRad[channel],
|
||||
turbidity,
|
||||
albedo,
|
||||
elevation);
|
||||
}
|
||||
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@ This source is published under the following 3-clause BSD license.
|
||||
Copyright (c) 2012 - 2013, Lukas Hosek and Alexander Wilkie
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
@ -12,8 +12,8 @@ modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* None of the names of the contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
* None of the names of the contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
@ -41,24 +41,24 @@ and the 2013 IEEE CG&A paper
|
||||
|
||||
"Adding a Solar Radiance Function to the Hosek Skylight Model"
|
||||
|
||||
both by
|
||||
both by
|
||||
|
||||
Lukas Hosek and Alexander Wilkie
|
||||
Charles University in Prague, Czech Republic
|
||||
|
||||
|
||||
Version: 1.4a, February 22nd, 2013
|
||||
|
||||
|
||||
Version history:
|
||||
|
||||
1.4a February 22nd, 2013
|
||||
Removed unnecessary and counter-intuitive solar radius parameters
|
||||
Removed unnecessary and counter-intuitive solar radius parameters
|
||||
from the interface of the colourspace sky dome initialisation functions.
|
||||
|
||||
1.4 February 11th, 2013
|
||||
Fixed a bug which caused the relative brightness of the solar disc
|
||||
and the sky dome to be off by a factor of about 6. The sun was too
|
||||
bright: this affected both normal and alien sun scenarios. The
|
||||
and the sky dome to be off by a factor of about 6. The sun was too
|
||||
bright: this affected both normal and alien sun scenarios. The
|
||||
coefficients of the solar radiance function were changed to fix this.
|
||||
|
||||
1.3 January 21st, 2013 (not released to the public)
|
||||
@ -82,7 +82,7 @@ Version history:
|
||||
the result of a simple conversion from spectral data via the CIE 2 degree
|
||||
standard observer matching functions. Therefore, after multiplication
|
||||
with 683 lm / W, the Y channel now corresponds to luminance in lm.
|
||||
|
||||
|
||||
1.0 May 11th, 2012
|
||||
Initial release.
|
||||
|
||||
@ -96,9 +96,9 @@ an updated version of this code has been published!
|
||||
/*
|
||||
|
||||
This code is taken from ART, a rendering research system written in a
|
||||
mix of C99 / Objective C. Since ART is not a small system and is intended to
|
||||
be inter-operable with other libraries, and since C does not have namespaces,
|
||||
the structures and functions in ART all have to have somewhat wordy
|
||||
mix of C99 / Objective C. Since ART is not a small system and is intended to
|
||||
be inter-operable with other libraries, and since C does not have namespaces,
|
||||
the structures and functions in ART all have to have somewhat wordy
|
||||
canonical names that begin with Ar.../ar..., like those seen in this example.
|
||||
|
||||
Usage information:
|
||||
@ -119,7 +119,7 @@ snippet, we assume that 'albedo' is defined as
|
||||
|
||||
double albedo[num_channels];
|
||||
|
||||
with a ground albedo value between [0,1] for each channel. The solar elevation
|
||||
with a ground albedo value between [0,1] for each channel. The solar elevation
|
||||
is given in radians.
|
||||
|
||||
for ( unsigned int i = 0; i < num_channels; i++ )
|
||||
@ -130,11 +130,11 @@ is given in radians.
|
||||
solarElevation
|
||||
);
|
||||
|
||||
Note that starting with version 1.3, there is also a second initialisation
|
||||
function which generates skydome states for different solar emission spectra
|
||||
Note that starting with version 1.3, there is also a second initialisation
|
||||
function which generates skydome states for different solar emission spectra
|
||||
and solar radii: 'arhosekskymodelstate_alienworld_alloc_init()'.
|
||||
|
||||
See the notes about the "Alien World" functionality provided further down for a
|
||||
See the notes about the "Alien World" functionality provided further down for a
|
||||
discussion of the usefulness and limits of that second initalisation function.
|
||||
Sky model states that have been initialized with either function behave in a
|
||||
completely identical fashion during use and cleanup.
|
||||
@ -155,7 +155,7 @@ on the skydome determined via the angles theta and gamma works as follows:
|
||||
gamma,
|
||||
channel_center[i]
|
||||
);
|
||||
|
||||
|
||||
The variable "channel_center" is assumed to hold the channel center wavelengths
|
||||
for each of the num_channels samples of the spectrum we are building.
|
||||
|
||||
@ -188,114 +188,114 @@ by calling arhosek_rgb_skymodelstate_alloc_init.
|
||||
Solar Radiance Function
|
||||
-----------------------
|
||||
|
||||
For each position on the solar disc, this function returns the entire radiance
|
||||
one sees - direct emission, as well as in-scattered light in the area of the
|
||||
solar disc. The latter is important for low solar elevations - nice images of
|
||||
the setting sun would not be possible without this. This is also the reason why
|
||||
this function, just like the regular sky dome model evaluation function, needs
|
||||
access to the sky dome data structures, as these provide information on
|
||||
For each position on the solar disc, this function returns the entire radiance
|
||||
one sees - direct emission, as well as in-scattered light in the area of the
|
||||
solar disc. The latter is important for low solar elevations - nice images of
|
||||
the setting sun would not be possible without this. This is also the reason why
|
||||
this function, just like the regular sky dome model evaluation function, needs
|
||||
access to the sky dome data structures, as these provide information on
|
||||
in-scattered radiance.
|
||||
|
||||
CAVEAT #1: in this release, this function is only provided in spectral form!
|
||||
RGB/XYZ versions to follow at a later date.
|
||||
|
||||
CAVEAT #2: (fixed from release 1.3 onwards)
|
||||
CAVEAT #2: (fixed from release 1.3 onwards)
|
||||
|
||||
CAVEAT #3: limb darkening renders the brightness of the solar disc
|
||||
inhomogeneous even for high solar elevations - only taking a single
|
||||
sample at the centre of the sun will yield an incorrect power
|
||||
estimate for the solar disc! Always take multiple random samples
|
||||
across the entire solar disc to estimate its power!
|
||||
|
||||
|
||||
CAVEAT #4: in this version, the limb darkening calculations still use a fairly
|
||||
computationally expensive 5th order polynomial that was directly
|
||||
computationally expensive 5th order polynomial that was directly
|
||||
taken from astronomical literature. For the purposes of Computer
|
||||
Graphics, this is needlessly accurate, though, and will be replaced
|
||||
Graphics, this is needlessly accurate, though, and will be replaced
|
||||
by a cheaper approximation in a future release.
|
||||
|
||||
"Alien World" functionality
|
||||
---------------------------
|
||||
|
||||
The Hosek sky model can be used to roughly (!) predict the appearance of
|
||||
outdoor scenes on earth-like planets, i.e. planets of a similar size and
|
||||
atmospheric make-up. Since the spectral version of our model predicts sky dome
|
||||
luminance patterns and solar radiance independently for each waveband, and
|
||||
since the intensity of each waveband is solely dependent on the input radiance
|
||||
from the star that the world in question is orbiting, it is trivial to re-scale
|
||||
The Hosek sky model can be used to roughly (!) predict the appearance of
|
||||
outdoor scenes on earth-like planets, i.e. planets of a similar size and
|
||||
atmospheric make-up. Since the spectral version of our model predicts sky dome
|
||||
luminance patterns and solar radiance independently for each waveband, and
|
||||
since the intensity of each waveband is solely dependent on the input radiance
|
||||
from the star that the world in question is orbiting, it is trivial to re-scale
|
||||
the wavebands to match a different star radiance.
|
||||
|
||||
At least in theory, the spectral version of the model has always been capable
|
||||
of this sort of thing, and the actual sky dome and solar radiance models were
|
||||
At least in theory, the spectral version of the model has always been capable
|
||||
of this sort of thing, and the actual sky dome and solar radiance models were
|
||||
actually not altered at all in this release. All we did was to add some support
|
||||
functionality for doing this more easily with the existing data and functions,
|
||||
functionality for doing this more easily with the existing data and functions,
|
||||
and to add some explanations.
|
||||
|
||||
Just use 'arhosekskymodelstate_alienworld_alloc_init()' to initialise the sky
|
||||
model states (you will have to provide values for star temperature and solar
|
||||
intensity compared to the terrestrial sun), and do everything else as you
|
||||
model states (you will have to provide values for star temperature and solar
|
||||
intensity compared to the terrestrial sun), and do everything else as you
|
||||
did before.
|
||||
|
||||
CAVEAT #1: we assume the emission of the star that illuminates the alien world
|
||||
to be a perfect blackbody emission spectrum. This is never entirely
|
||||
realistic - real star emission spectra are considerably more complex
|
||||
than this, mainly due to absorption effects in the outer layers of
|
||||
stars. However, blackbody spectra are a reasonable first assumption
|
||||
in a usage scenario like this, where 100% accuracy is simply not
|
||||
necessary: for rendering purposes, there are likely no visible
|
||||
differences between a highly accurate solution based on a more
|
||||
CAVEAT #1: we assume the emission of the star that illuminates the alien world
|
||||
to be a perfect blackbody emission spectrum. This is never entirely
|
||||
realistic - real star emission spectra are considerably more complex
|
||||
than this, mainly due to absorption effects in the outer layers of
|
||||
stars. However, blackbody spectra are a reasonable first assumption
|
||||
in a usage scenario like this, where 100% accuracy is simply not
|
||||
necessary: for rendering purposes, there are likely no visible
|
||||
differences between a highly accurate solution based on a more
|
||||
involved simulation, and this approximation.
|
||||
|
||||
CAVEAT #2: we always use limb darkening data from our own sun to provide this
|
||||
"appearance feature", even for suns of strongly different
|
||||
temperature. Which is presumably not very realistic, but (as with
|
||||
the unaltered blackbody spectrum from caveat #1) probably not a bad
|
||||
"appearance feature", even for suns of strongly different
|
||||
temperature. Which is presumably not very realistic, but (as with
|
||||
the unaltered blackbody spectrum from caveat #1) probably not a bad
|
||||
first guess, either. If you need more accuracy than we provide here,
|
||||
please make inquiries with a friendly astro-physicst of your choice.
|
||||
|
||||
CAVEAT #3: you have to provide a value for the solar intensity of the star
|
||||
which illuminates the alien world. For this, please bear in mind
|
||||
that there is very likely a comparatively tight range of absolute
|
||||
solar irradiance values for which an earth-like planet with an
|
||||
atmosphere like the one we assume in our model can exist in the
|
||||
CAVEAT #3: you have to provide a value for the solar intensity of the star
|
||||
which illuminates the alien world. For this, please bear in mind
|
||||
that there is very likely a comparatively tight range of absolute
|
||||
solar irradiance values for which an earth-like planet with an
|
||||
atmosphere like the one we assume in our model can exist in the
|
||||
first place!
|
||||
|
||||
Too much irradiance, and the atmosphere probably boils off into
|
||||
space, too little, it freezes. Which means that stars of
|
||||
considerably different emission colour than our sun will have to be
|
||||
fairly different in size from it, to still provide a reasonable and
|
||||
inhabitable amount of irradiance. Red stars will need to be much
|
||||
larger than our sun, while white or blue stars will have to be
|
||||
comparatively tiny. The initialisation function handles this and
|
||||
|
||||
Too much irradiance, and the atmosphere probably boils off into
|
||||
space, too little, it freezes. Which means that stars of
|
||||
considerably different emission colour than our sun will have to be
|
||||
fairly different in size from it, to still provide a reasonable and
|
||||
inhabitable amount of irradiance. Red stars will need to be much
|
||||
larger than our sun, while white or blue stars will have to be
|
||||
comparatively tiny. The initialisation function handles this and
|
||||
computes a plausible solar radius for a given emission spectrum. In
|
||||
terms of absolute radiometric values, you should probably not stray
|
||||
all too far from a solar intensity value of 1.0.
|
||||
|
||||
CAVEAT #4: although we now support different solar radii for the actual solar
|
||||
disc, the sky dome luminance patterns are *not* parameterised by
|
||||
this value - i.e. the patterns stay exactly the same for different
|
||||
solar radii! Which is of course not correct. But in our experience,
|
||||
solar discs up to several degrees in diameter (! - our own sun is
|
||||
half a degree across) do not cause the luminance patterns on the sky
|
||||
to change perceptibly. The reason we know this is that we initially
|
||||
used unrealistically large suns in our brute force path tracer, in
|
||||
order to improve convergence speeds (which in the beginning were
|
||||
abysmal). Later, we managed to do the reference renderings much
|
||||
faster even with realistically small suns, and found that there was
|
||||
no real difference in skydome appearance anyway.
|
||||
Conclusion: changing the solar radius should not be over-done, so
|
||||
close orbits around red supergiants are a no-no. But for the
|
||||
purposes of getting a fairly credible first impression of what an
|
||||
alien world with a reasonably sized sun would look like, what we are
|
||||
CAVEAT #4: although we now support different solar radii for the actual solar
|
||||
disc, the sky dome luminance patterns are *not* parameterised by
|
||||
this value - i.e. the patterns stay exactly the same for different
|
||||
solar radii! Which is of course not correct. But in our experience,
|
||||
solar discs up to several degrees in diameter (! - our own sun is
|
||||
half a degree across) do not cause the luminance patterns on the sky
|
||||
to change perceptibly. The reason we know this is that we initially
|
||||
used unrealistically large suns in our brute force path tracer, in
|
||||
order to improve convergence speeds (which in the beginning were
|
||||
abysmal). Later, we managed to do the reference renderings much
|
||||
faster even with realistically small suns, and found that there was
|
||||
no real difference in skydome appearance anyway.
|
||||
Conclusion: changing the solar radius should not be over-done, so
|
||||
close orbits around red supergiants are a no-no. But for the
|
||||
purposes of getting a fairly credible first impression of what an
|
||||
alien world with a reasonably sized sun would look like, what we are
|
||||
doing here is probably still o.k.
|
||||
|
||||
HINT #1: if you want to model the sky of an earth-like planet that orbits
|
||||
a binary star, just super-impose two of these models with solar
|
||||
HINT #1: if you want to model the sky of an earth-like planet that orbits
|
||||
a binary star, just super-impose two of these models with solar
|
||||
intensity of ~0.5 each, and closely spaced solar positions. Light is
|
||||
additive, after all. Tattooine, here we come... :-)
|
||||
|
||||
P.S. according to Star Wars canon, Tattooine orbits a binary
|
||||
that is made up of a G and K class star, respectively.
|
||||
So ~5500K and ~4200K should be good first guesses for their
|
||||
that is made up of a G and K class star, respectively.
|
||||
So ~5500K and ~4200K should be good first guesses for their
|
||||
temperature. Just in case you were wondering, after reading the
|
||||
previous paragraph.
|
||||
*/
|
||||
@ -316,37 +316,37 @@ typedef double ArHosekSkyModelConfiguration[9];
|
||||
---------------------------
|
||||
|
||||
This struct holds the pre-computation data for one particular albedo value.
|
||||
Most fields are self-explanatory, but users should never directly
|
||||
manipulate any of them anyway. The only consistent way to manipulate such
|
||||
structs is via the functions 'arhosekskymodelstate_alloc_init' and
|
||||
Most fields are self-explanatory, but users should never directly
|
||||
manipulate any of them anyway. The only consistent way to manipulate such
|
||||
structs is via the functions 'arhosekskymodelstate_alloc_init' and
|
||||
'arhosekskymodelstate_free'.
|
||||
|
||||
|
||||
'emission_correction_factor_sky'
|
||||
'emission_correction_factor_sun'
|
||||
|
||||
The original model coefficients were fitted against the emission of
|
||||
The original model coefficients were fitted against the emission of
|
||||
our local sun. If a different solar emission is desired (i.e. if the
|
||||
model is being used to predict skydome appearance for an earth-like
|
||||
planet that orbits a different star), these correction factors, which
|
||||
are determined during the alloc_init step, are applied to each waveband
|
||||
separately (they default to 1.0 in normal usage). This is the simplest
|
||||
way to retrofit this sort of capability to the existing model. The
|
||||
different factors for sky and sun are needed since the solar disc may
|
||||
model is being used to predict skydome appearance for an earth-like
|
||||
planet that orbits a different star), these correction factors, which
|
||||
are determined during the alloc_init step, are applied to each waveband
|
||||
separately (they default to 1.0 in normal usage). This is the simplest
|
||||
way to retrofit this sort of capability to the existing model. The
|
||||
different factors for sky and sun are needed since the solar disc may
|
||||
be of a different size compared to the terrestrial sun.
|
||||
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
typedef struct ArHosekSkyModelState
|
||||
{
|
||||
ArHosekSkyModelConfiguration configs[11];
|
||||
double radiances[11];
|
||||
double turbidity;
|
||||
double solar_radius;
|
||||
double emission_correction_factor_sky[11];
|
||||
double emission_correction_factor_sun[11];
|
||||
double albedo;
|
||||
double elevation;
|
||||
}
|
||||
ArHosekSkyModelConfiguration configs[11];
|
||||
double radiances[11];
|
||||
double turbidity;
|
||||
double solar_radius;
|
||||
double emission_correction_factor_sky[11];
|
||||
double emission_correction_factor_sun[11];
|
||||
double albedo;
|
||||
double elevation;
|
||||
}
|
||||
ArHosekSkyModelState;
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
@ -358,11 +358,10 @@ ArHosekSkyModelState;
|
||||
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
ArHosekSkyModelState * arhosekskymodelstate_alloc_init(
|
||||
const double solar_elevation,
|
||||
const double atmospheric_turbidity,
|
||||
const double ground_albedo
|
||||
);
|
||||
ArHosekSkyModelState *arhosekskymodelstate_alloc_init(
|
||||
const double solar_elevation,
|
||||
const double atmospheric_turbidity,
|
||||
const double ground_albedo);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
@ -375,78 +374,67 @@ ArHosekSkyModelState * arhosekskymodelstate_alloc_init(
|
||||
'solar_intensity' controls the overall brightness of the sky, relative
|
||||
to the solar irradiance on Earth. A value of 1.0 yields a sky dome that
|
||||
is, on average over the wavelenghts covered in the model (!), as bright
|
||||
as the terrestrial sky in radiometric terms.
|
||||
|
||||
Which means that the solar radius has to be adjusted, since the
|
||||
emissivity of a solar surface with a given temperature is more or less
|
||||
fixed. So hotter suns have to be smaller to be equally bright as the
|
||||
as the terrestrial sky in radiometric terms.
|
||||
|
||||
Which means that the solar radius has to be adjusted, since the
|
||||
emissivity of a solar surface with a given temperature is more or less
|
||||
fixed. So hotter suns have to be smaller to be equally bright as the
|
||||
terrestrial sun, while cooler suns have to be larger. Note that there are
|
||||
limits to the validity of the luminance patterns of the underlying model:
|
||||
see the discussion above for more on this. In particular, an alien sun with
|
||||
a surface temperature of only 2000 Kelvin has to be very large if it is
|
||||
to be as bright as the terrestrial sun - so large that the luminance
|
||||
to be as bright as the terrestrial sun - so large that the luminance
|
||||
patterns are no longer a really good fit in that case.
|
||||
|
||||
|
||||
If you need information about the solar radius that the model computes
|
||||
for a given temperature (say, for light source sampling purposes), you
|
||||
have to query the 'solar_radius' variable of the sky model state returned
|
||||
for a given temperature (say, for light source sampling purposes), you
|
||||
have to query the 'solar_radius' variable of the sky model state returned
|
||||
*after* running this function.
|
||||
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
ArHosekSkyModelState * arhosekskymodelstate_alienworld_alloc_init(
|
||||
const double solar_elevation,
|
||||
const double solar_intensity,
|
||||
const double solar_surface_temperature_kelvin,
|
||||
const double atmospheric_turbidity,
|
||||
const double ground_albedo
|
||||
);
|
||||
ArHosekSkyModelState* arhosekskymodelstate_alienworld_alloc_init(
|
||||
const double solar_elevation,
|
||||
const double solar_intensity,
|
||||
const double solar_surface_temperature_kelvin,
|
||||
const double atmospheric_turbidity,
|
||||
const double ground_albedo);
|
||||
|
||||
void arhosekskymodelstate_free(
|
||||
ArHosekSkyModelState * state
|
||||
);
|
||||
void arhosekskymodelstate_free(ArHosekSkyModelState *state);
|
||||
|
||||
double arhosekskymodel_radiance(
|
||||
ArHosekSkyModelState * state,
|
||||
double theta,
|
||||
double gamma,
|
||||
double wavelength
|
||||
);
|
||||
double arhosekskymodel_radiance(ArHosekSkyModelState *state,
|
||||
double theta,
|
||||
double gamma,
|
||||
double wavelength);
|
||||
|
||||
// CIE XYZ and RGB versions
|
||||
|
||||
|
||||
ArHosekSkyModelState * arhosek_xyz_skymodelstate_alloc_init(
|
||||
const double turbidity,
|
||||
const double albedo,
|
||||
const double elevation
|
||||
);
|
||||
const double turbidity,
|
||||
const double albedo,
|
||||
const double elevation);
|
||||
|
||||
|
||||
ArHosekSkyModelState * arhosek_rgb_skymodelstate_alloc_init(
|
||||
const double turbidity,
|
||||
const double albedo,
|
||||
const double elevation
|
||||
);
|
||||
const double turbidity,
|
||||
const double albedo,
|
||||
const double elevation);
|
||||
|
||||
|
||||
double arhosek_tristim_skymodel_radiance(
|
||||
ArHosekSkyModelState * state,
|
||||
double theta,
|
||||
double gamma,
|
||||
int channel
|
||||
);
|
||||
double arhosek_tristim_skymodel_radiance(ArHosekSkyModelState* state,
|
||||
double theta,
|
||||
double gamma,
|
||||
int channel);
|
||||
|
||||
// Delivers the complete function: sky + sun, including limb darkening.
|
||||
// Please read the above description before using this - there are several
|
||||
// caveats!
|
||||
|
||||
double arhosekskymodel_solar_radiance(
|
||||
ArHosekSkyModelState * state,
|
||||
double theta,
|
||||
double gamma,
|
||||
double wavelength
|
||||
);
|
||||
double arhosekskymodel_solar_radiance(ArHosekSkyModelState* state,
|
||||
double theta,
|
||||
double gamma,
|
||||
double wavelength);
|
||||
|
||||
|
||||
#endif // _SKY_MODEL_H_
|
||||
|
@ -4,7 +4,7 @@ This source is published under the following 3-clause BSD license.
|
||||
Copyright (c) 2012 - 2013, Lukas Hosek and Alexander Wilkie
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
@ -12,8 +12,8 @@ modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* None of the names of the contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
* None of the names of the contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
@ -41,24 +41,24 @@ and the 2013 IEEE CG&A paper
|
||||
|
||||
"Adding a Solar Radiance Function to the Hosek Skylight Model"
|
||||
|
||||
both by
|
||||
both by
|
||||
|
||||
Lukas Hosek and Alexander Wilkie
|
||||
Charles University in Prague, Czech Republic
|
||||
|
||||
|
||||
Version: 1.4a, February 22nd, 2013
|
||||
|
||||
|
||||
Version history:
|
||||
|
||||
1.4a February 22nd, 2013
|
||||
Removed unnecessary and counter-intuitive solar radius parameters
|
||||
Removed unnecessary and counter-intuitive solar radius parameters
|
||||
from the interface of the colourspace sky dome initialisation functions.
|
||||
|
||||
1.4 February 11th, 2013
|
||||
Fixed a bug which caused the relative brightness of the solar disc
|
||||
and the sky dome to be off by a factor of about 6. The sun was too
|
||||
bright: this affected both normal and alien sun scenarios. The
|
||||
and the sky dome to be off by a factor of about 6. The sun was too
|
||||
bright: this affected both normal and alien sun scenarios. The
|
||||
coefficients of the solar radiance function were changed to fix this.
|
||||
|
||||
1.3 January 21st, 2013 (not released to the public)
|
||||
@ -82,7 +82,7 @@ Version history:
|
||||
the result of a simple conversion from spectral data via the CIE 2 degree
|
||||
standard observer matching functions. Therefore, after multiplication
|
||||
with 683 lm / W, the Y channel now corresponds to luminance in lm.
|
||||
|
||||
|
||||
1.0 May 11th, 2012
|
||||
Initial release.
|
||||
|
||||
@ -96,15 +96,14 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
/*
|
||||
|
||||
This file contains the coefficient data for the XYZ colour space version of
|
||||
This file contains the coefficient data for the XYZ colour space version of
|
||||
the model.
|
||||
|
||||
*/
|
||||
|
||||
// Uses Sep 9 pattern / Aug 23 mean dataset
|
||||
|
||||
static const double datasetXYZ1[] =
|
||||
{
|
||||
static const double datasetXYZ1[] = {
|
||||
// albedo 0, turbidity 1
|
||||
-1.117001e+000,
|
||||
-1.867262e-001,
|
||||
@ -3849,15 +3848,13 @@ static const double datasetXYZRad3[] =
|
||||
|
||||
|
||||
|
||||
static const double* datasetsXYZ[] =
|
||||
{
|
||||
static const double* datasetsXYZ[] = {
|
||||
datasetXYZ1,
|
||||
datasetXYZ2,
|
||||
datasetXYZ3
|
||||
};
|
||||
|
||||
static const double* datasetsXYZRad[] =
|
||||
{
|
||||
static const double* datasetsXYZRad[] = {
|
||||
datasetXYZRad1,
|
||||
datasetXYZRad2,
|
||||
datasetXYZRad3
|
||||
|
Loading…
Reference in New Issue
Block a user