Cycles: Add control for sun intensity in Sky Texture and change altitude to km
Differential Revision: https://developer.blender.org/D8091
This commit is contained in:
parent
e2736afdbe
commit
41e6f9bd43
|
@ -815,9 +815,10 @@ static ShaderNode *add_node(Scene *scene,
|
|||
sky->ground_albedo = b_sky_node.ground_albedo();
|
||||
sky->sun_disc = b_sky_node.sun_disc();
|
||||
sky->sun_size = b_sky_node.sun_size();
|
||||
sky->sun_intensity = b_sky_node.sun_intensity();
|
||||
sky->sun_elevation = b_sky_node.sun_elevation();
|
||||
sky->sun_rotation = b_sky_node.sun_rotation();
|
||||
sky->altitude = b_sky_node.altitude();
|
||||
sky->altitude = 1000.0f * b_sky_node.altitude();
|
||||
sky->air_density = b_sky_node.air_density();
|
||||
sky->dust_density = b_sky_node.dust_density();
|
||||
sky->ozone_density = b_sky_node.ozone_density();
|
||||
|
|
|
@ -127,12 +127,13 @@ float precise_angle(vector a, vector b)
|
|||
return 2.0 * atan2(length(a - b), length(a + b));
|
||||
}
|
||||
|
||||
color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
||||
color sky_radiance_nishita(vector dir, float nishita_data[10], string filename)
|
||||
{
|
||||
/* definitions */
|
||||
float sun_elevation = nishita_data[6];
|
||||
float sun_rotation = nishita_data[7];
|
||||
float angular_diameter = nishita_data[8];
|
||||
float sun_intensity = nishita_data[9];
|
||||
int sun_disc = angular_diameter > 0;
|
||||
float alpha = 1.0;
|
||||
color xyz;
|
||||
|
@ -158,13 +159,13 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
|||
if (sun_elevation - half_angular > 0.0) {
|
||||
if ((sun_elevation + half_angular) > 0.0) {
|
||||
y = ((dir_elevation - sun_elevation) / angular_diameter) + 0.5;
|
||||
xyz = mix(pixel_bottom, pixel_top, y);
|
||||
xyz = mix(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (sun_elevation + half_angular > 0.0) {
|
||||
y = dir_elevation / (sun_elevation + half_angular);
|
||||
xyz = mix(pixel_bottom, pixel_top, y);
|
||||
xyz = mix(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
/* limb darkening, coefficient is 0.6f */
|
||||
|
@ -206,19 +207,20 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
|
|||
return xyz_to_rgb(xyz[0], xyz[1], xyz[2]) * 120000.0;
|
||||
}
|
||||
|
||||
shader node_sky_texture(int use_mapping = 0,
|
||||
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
vector Vector = P,
|
||||
string type = "hosek_wilkie",
|
||||
float theta = 0.0,
|
||||
float phi = 0.0,
|
||||
string filename = "",
|
||||
color radiance = color(0.0, 0.0, 0.0),
|
||||
float config_x[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_y[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_z[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float nishita_data[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
output color Color = color(0.0, 0.0, 0.0))
|
||||
shader node_sky_texture(
|
||||
int use_mapping = 0,
|
||||
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
||||
vector Vector = P,
|
||||
string type = "hosek_wilkie",
|
||||
float theta = 0.0,
|
||||
float phi = 0.0,
|
||||
string filename = "",
|
||||
color radiance = color(0.0, 0.0, 0.0),
|
||||
float config_x[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_y[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float config_z[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
float nishita_data[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||
output color Color = color(0.0, 0.0, 0.0))
|
||||
{
|
||||
vector p = Vector;
|
||||
|
||||
|
|
|
@ -136,6 +136,7 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals *kg,
|
|||
float sun_elevation = nishita_data[6];
|
||||
float sun_rotation = nishita_data[7];
|
||||
float angular_diameter = nishita_data[8];
|
||||
float sun_intensity = nishita_data[9];
|
||||
bool sun_disc = (angular_diameter > 0.0f);
|
||||
float3 xyz;
|
||||
/* convert dir to spherical coordinates */
|
||||
|
@ -160,13 +161,13 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals *kg,
|
|||
if (sun_elevation - half_angular > 0.0f) {
|
||||
if (sun_elevation + half_angular > 0.0f) {
|
||||
y = ((dir_elevation - sun_elevation) / angular_diameter) + 0.5f;
|
||||
xyz = interp(pixel_bottom, pixel_top, y);
|
||||
xyz = interp(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (sun_elevation + half_angular > 0.0f) {
|
||||
y = dir_elevation / (sun_elevation + half_angular);
|
||||
xyz = interp(pixel_bottom, pixel_top, y);
|
||||
xyz = interp(pixel_bottom, pixel_top, y) * sun_intensity;
|
||||
}
|
||||
}
|
||||
/* limb darkening, coefficient is 0.6f */
|
||||
|
@ -301,7 +302,7 @@ ccl_device void svm_node_tex_sky(
|
|||
/* Nishita */
|
||||
else {
|
||||
/* Define variables */
|
||||
float nishita_data[9];
|
||||
float nishita_data[10];
|
||||
|
||||
float4 data = read_node_float(kg, offset);
|
||||
nishita_data[0] = data.x;
|
||||
|
@ -317,7 +318,8 @@ ccl_device void svm_node_tex_sky(
|
|||
|
||||
data = read_node_float(kg, offset);
|
||||
nishita_data[8] = data.x;
|
||||
uint texture_id = __float_as_uint(data.y);
|
||||
nishita_data[9] = data.y;
|
||||
uint texture_id = __float_as_uint(data.z);
|
||||
|
||||
/* Compute Sky */
|
||||
f = sky_radiance_nishita(kg, dir, nishita_data, texture_id);
|
||||
|
|
|
@ -25,8 +25,11 @@
|
|||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
SkyLoader::SkyLoader(
|
||||
float sun_elevation, int altitude, float air_density, float dust_density, float ozone_density)
|
||||
SkyLoader::SkyLoader(float sun_elevation,
|
||||
float altitude,
|
||||
float air_density,
|
||||
float dust_density,
|
||||
float ozone_density)
|
||||
: sun_elevation(sun_elevation),
|
||||
altitude(altitude),
|
||||
air_density(air_density),
|
||||
|
@ -57,7 +60,6 @@ bool SkyLoader::load_pixels(const ImageMetaData &metadata,
|
|||
int width = metadata.width;
|
||||
int height = metadata.height;
|
||||
float *pixel_data = (float *)pixels;
|
||||
float altitude_f = (float)altitude;
|
||||
|
||||
/* precompute sky texture */
|
||||
const int rows_per_task = divide_up(1024, width);
|
||||
|
@ -70,7 +72,7 @@ bool SkyLoader::load_pixels(const ImageMetaData &metadata,
|
|||
width,
|
||||
height,
|
||||
sun_elevation,
|
||||
altitude_f,
|
||||
altitude,
|
||||
air_density,
|
||||
dust_density,
|
||||
ozone_density);
|
||||
|
|
|
@ -21,14 +21,14 @@ CCL_NAMESPACE_BEGIN
|
|||
class SkyLoader : public ImageLoader {
|
||||
private:
|
||||
float sun_elevation;
|
||||
int altitude;
|
||||
float altitude;
|
||||
float air_density;
|
||||
float dust_density;
|
||||
float ozone_density;
|
||||
|
||||
public:
|
||||
SkyLoader(float sun_elevation,
|
||||
int altitude,
|
||||
float altitude,
|
||||
float air_density,
|
||||
float dust_density,
|
||||
float ozone_density);
|
||||
|
|
|
@ -632,7 +632,7 @@ typedef struct SunSky {
|
|||
|
||||
/* Parameter */
|
||||
float radiance_x, radiance_y, radiance_z;
|
||||
float config_x[9], config_y[9], config_z[9], nishita_data[9];
|
||||
float config_x[9], config_y[9], config_z[9], nishita_data[10];
|
||||
} SunSky;
|
||||
|
||||
/* Preetham model */
|
||||
|
@ -749,18 +749,18 @@ static void sky_texture_precompute_hosek(SunSky *sunsky,
|
|||
static void sky_texture_precompute_nishita(SunSky *sunsky,
|
||||
bool sun_disc,
|
||||
float sun_size,
|
||||
float sun_intensity,
|
||||
float sun_elevation,
|
||||
float sun_rotation,
|
||||
int altitude,
|
||||
float altitude,
|
||||
float air_density,
|
||||
float dust_density)
|
||||
{
|
||||
/* sample 2 sun pixels */
|
||||
float pixel_bottom[3];
|
||||
float pixel_top[3];
|
||||
float altitude_f = (float)altitude;
|
||||
SKY_nishita_skymodel_precompute_sun(
|
||||
sun_elevation, sun_size, altitude_f, air_density, dust_density, pixel_bottom, pixel_top);
|
||||
sun_elevation, sun_size, altitude, air_density, dust_density, pixel_bottom, pixel_top);
|
||||
/* limit sun rotation between 0 and 360 degrees */
|
||||
sun_rotation = fmodf(sun_rotation, M_2PI_F);
|
||||
if (sun_rotation < 0.0f) {
|
||||
|
@ -777,6 +777,7 @@ static void sky_texture_precompute_nishita(SunSky *sunsky,
|
|||
sunsky->nishita_data[6] = sun_elevation;
|
||||
sunsky->nishita_data[7] = sun_rotation;
|
||||
sunsky->nishita_data[8] = sun_disc ? sun_size : 0.0f;
|
||||
sunsky->nishita_data[9] = sun_intensity;
|
||||
}
|
||||
|
||||
NODE_DEFINE(SkyTextureNode)
|
||||
|
@ -796,9 +797,10 @@ NODE_DEFINE(SkyTextureNode)
|
|||
SOCKET_FLOAT(ground_albedo, "Ground Albedo", 0.3f);
|
||||
SOCKET_BOOLEAN(sun_disc, "Sun Disc", true);
|
||||
SOCKET_FLOAT(sun_size, "Sun Size", 0.009512f);
|
||||
SOCKET_FLOAT(sun_intensity, "Sun Intensity", 1.0f);
|
||||
SOCKET_FLOAT(sun_elevation, "Sun Elevation", M_PI_2_F);
|
||||
SOCKET_FLOAT(sun_rotation, "Sun Rotation", 0.0f);
|
||||
SOCKET_INT(altitude, "Altitude", 0);
|
||||
SOCKET_FLOAT(altitude, "Altitude", 1.0f);
|
||||
SOCKET_FLOAT(air_density, "Air", 1.0f);
|
||||
SOCKET_FLOAT(dust_density, "Dust", 1.0f);
|
||||
SOCKET_FLOAT(ozone_density, "Ozone", 1.0f);
|
||||
|
@ -829,6 +831,7 @@ void SkyTextureNode::compile(SVMCompiler &compiler)
|
|||
sky_texture_precompute_nishita(&sunsky,
|
||||
sun_disc,
|
||||
sun_size,
|
||||
sun_intensity,
|
||||
sun_elevation,
|
||||
sun_rotation,
|
||||
altitude,
|
||||
|
@ -898,7 +901,10 @@ void SkyTextureNode::compile(SVMCompiler &compiler)
|
|||
__float_as_uint(sunsky.nishita_data[5]),
|
||||
__float_as_uint(sunsky.nishita_data[6]),
|
||||
__float_as_uint(sunsky.nishita_data[7]));
|
||||
compiler.add_node(__float_as_uint(sunsky.nishita_data[8]), handle.svm_slot(), 0, 0);
|
||||
compiler.add_node(__float_as_uint(sunsky.nishita_data[8]),
|
||||
__float_as_uint(sunsky.nishita_data[9]),
|
||||
handle.svm_slot(),
|
||||
0);
|
||||
}
|
||||
|
||||
tex_mapping.compile_end(compiler, vector_in, vector_offset);
|
||||
|
@ -917,6 +923,7 @@ void SkyTextureNode::compile(OSLCompiler &compiler)
|
|||
sky_texture_precompute_nishita(&sunsky,
|
||||
sun_disc,
|
||||
sun_size,
|
||||
sun_intensity,
|
||||
sun_elevation,
|
||||
sun_rotation,
|
||||
altitude,
|
||||
|
@ -946,7 +953,7 @@ void SkyTextureNode::compile(OSLCompiler &compiler)
|
|||
compiler.parameter_array("config_x", sunsky.config_x, 9);
|
||||
compiler.parameter_array("config_y", sunsky.config_y, 9);
|
||||
compiler.parameter_array("config_z", sunsky.config_z, 9);
|
||||
compiler.parameter_array("nishita_data", sunsky.nishita_data, 9);
|
||||
compiler.parameter_array("nishita_data", sunsky.nishita_data, 10);
|
||||
/* nishita texture */
|
||||
if (type == NODE_SKY_NISHITA) {
|
||||
compiler.parameter_texture("filename", handle.svm_slot());
|
||||
|
|
|
@ -170,9 +170,10 @@ class SkyTextureNode : public TextureNode {
|
|||
float ground_albedo;
|
||||
bool sun_disc;
|
||||
float sun_size;
|
||||
float sun_intensity;
|
||||
float sun_elevation;
|
||||
float sun_rotation;
|
||||
int altitude;
|
||||
float altitude;
|
||||
float air_density;
|
||||
float dust_density;
|
||||
float ozone_density;
|
||||
|
|
|
@ -389,5 +389,21 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
*/
|
||||
{
|
||||
/* Keep this block, even when empty. */
|
||||
|
||||
/* Initialize additional parameter of the Nishita sky model and change altitude unit. */
|
||||
if (!DNA_struct_elem_find(fd->filesdna, "NodeTexSky", "float", "sun_intensity")) {
|
||||
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
|
||||
if (ntree->type == NTREE_SHADER) {
|
||||
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
|
||||
if (node->type == SH_NODE_TEX_SKY && node->storage) {
|
||||
NodeTexSky *tex = (NodeTexSky *)node->storage;
|
||||
tex->sun_intensity = 1.0f;
|
||||
tex->altitude *= 0.001f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
FOREACH_NODETREE_END;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -860,11 +860,13 @@ static void node_shader_buts_tex_sky(uiLayout *layout, bContext *UNUSED(C), Poin
|
|||
if (RNA_enum_get(ptr, "sky_type") == SHD_SKY_NISHITA) {
|
||||
uiItemR(layout, ptr, "sun_disc", DEFAULT_FLAGS, NULL, 0);
|
||||
|
||||
uiLayout *col;
|
||||
if (RNA_boolean_get(ptr, "sun_disc")) {
|
||||
uiItemR(layout, ptr, "sun_size", DEFAULT_FLAGS, NULL, ICON_NONE);
|
||||
col = uiLayoutColumn(layout, true);
|
||||
uiItemR(col, ptr, "sun_size", DEFAULT_FLAGS, NULL, ICON_NONE);
|
||||
uiItemR(col, ptr, "sun_intensity", DEFAULT_FLAGS, NULL, ICON_NONE);
|
||||
}
|
||||
|
||||
uiLayout *col;
|
||||
col = uiLayoutColumn(layout, true);
|
||||
uiItemR(col, ptr, "sun_elevation", DEFAULT_FLAGS, NULL, ICON_NONE);
|
||||
uiItemR(col, ptr, "sun_rotation", DEFAULT_FLAGS, NULL, ICON_NONE);
|
||||
|
|
|
@ -845,14 +845,15 @@ typedef struct NodeTexSky {
|
|||
float turbidity;
|
||||
float ground_albedo;
|
||||
float sun_size;
|
||||
float sun_intensity;
|
||||
float sun_elevation;
|
||||
float sun_rotation;
|
||||
int altitude;
|
||||
float altitude;
|
||||
float air_density;
|
||||
float dust_density;
|
||||
float ozone_density;
|
||||
char sun_disc;
|
||||
char _pad[3];
|
||||
char _pad[7];
|
||||
} NodeTexSky;
|
||||
|
||||
typedef struct NodeTexImage {
|
||||
|
|
|
@ -4453,6 +4453,12 @@ static void def_sh_tex_sky(StructRNA *srna)
|
|||
RNA_def_property_float_default(prop, DEG2RADF(0.545));
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
|
||||
|
||||
prop = RNA_def_property(srna, "sun_intensity", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_ui_text(prop, "Sun Intensity", "Strength of sun");
|
||||
RNA_def_property_range(prop, 0.0f, 1000.0f);
|
||||
RNA_def_property_float_default(prop, 1.0f);
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
|
||||
|
||||
prop = RNA_def_property(srna, "sun_elevation", PROP_FLOAT, PROP_ANGLE);
|
||||
RNA_def_property_ui_text(prop, "Sun Elevation", "Angle between sun and horizon");
|
||||
RNA_def_property_range(prop, -M_PI_2, M_PI_2);
|
||||
|
@ -4464,10 +4470,10 @@ static void def_sh_tex_sky(StructRNA *srna)
|
|||
RNA_def_property_float_default(prop, 0.0f);
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
|
||||
|
||||
prop = RNA_def_property(srna, "altitude", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_ui_text(prop, "Altitude", "Altitude height from sea level in meters");
|
||||
RNA_def_property_range(prop, 0, 60000);
|
||||
RNA_def_property_int_default(prop, 0);
|
||||
prop = RNA_def_property(srna, "altitude", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_ui_text(prop, "Altitude", "Height from sea level in km");
|
||||
RNA_def_property_range(prop, 0.0f, 60.0f);
|
||||
RNA_def_property_float_default(prop, 0.0f);
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
|
||||
|
||||
prop = RNA_def_property(srna, "air_density", PROP_FLOAT, PROP_FACTOR);
|
||||
|
|
|
@ -44,9 +44,10 @@ static void node_shader_init_tex_sky(bNodeTree *UNUSED(ntree), bNode *node)
|
|||
tex->ground_albedo = 0.3f;
|
||||
tex->sun_disc = true;
|
||||
tex->sun_size = DEG2RADF(0.545);
|
||||
tex->sun_intensity = 1.0f;
|
||||
tex->sun_elevation = M_PI_2;
|
||||
tex->sun_rotation = 0.0f;
|
||||
tex->altitude = 0;
|
||||
tex->altitude = 0.0f;
|
||||
tex->air_density = 1.0f;
|
||||
tex->dust_density = 1.0f;
|
||||
tex->ozone_density = 1.0f;
|
||||
|
|
Loading…
Reference in New Issue