I'm not sure if the Sky was deliberately left out or was just waiting for a better moment, but so many I was disappointed that Sky in EEVEE is completely white. There are already 2 implementations (osl and gpu) so this is the third one. Looking at other cases it seems that we are not supposed to share sources between cycles and the rest? So the new util_sky_model files are just copies of what is already in cycles, except that the data file uses the RGB variant of the Hosek/Wilkie model, because we output RGB anyway (but can be easily changed to XYZ if desired - the results are nearly identical). I am not sure if it is okay to pass 3*9 float values as 3 mat4 uniforms (I wanted to use mat3 but it does not work). Also, should I cache the sky model data between renders if the parameters do not change? Reviewed By: fclem, brecht Differential Revision: https://developer.blender.org/D7108
93 lines
2.8 KiB
C++
93 lines
2.8 KiB
C++
/*
|
|
* Copyright 2011-2020 Blender Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "render/image_sky.h"
|
|
|
|
#include "sky_model.h"
|
|
|
|
#include "util/util_image.h"
|
|
#include "util/util_logging.h"
|
|
#include "util/util_path.h"
|
|
#include "util/util_task.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
SkyLoader::SkyLoader(
|
|
float sun_elevation, int altitude, float air_density, float dust_density, float ozone_density)
|
|
: sun_elevation(sun_elevation),
|
|
altitude(altitude),
|
|
air_density(air_density),
|
|
dust_density(dust_density),
|
|
ozone_density(ozone_density)
|
|
{
|
|
}
|
|
|
|
SkyLoader::~SkyLoader(){};
|
|
|
|
bool SkyLoader::load_metadata(ImageMetaData &metadata)
|
|
{
|
|
metadata.width = 512;
|
|
metadata.height = 128;
|
|
metadata.channels = 3;
|
|
metadata.depth = 1;
|
|
metadata.type = IMAGE_DATA_TYPE_FLOAT4;
|
|
metadata.compress_as_srgb = false;
|
|
return true;
|
|
}
|
|
|
|
bool SkyLoader::load_pixels(const ImageMetaData &metadata,
|
|
void *pixels,
|
|
const size_t /*pixels_size*/,
|
|
const bool /*associate_alpha*/)
|
|
{
|
|
/* definitions */
|
|
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);
|
|
parallel_for(blocked_range<size_t>(0, height, rows_per_task),
|
|
[&](const blocked_range<size_t> &r) {
|
|
SKY_nishita_skymodel_precompute_texture(pixel_data,
|
|
metadata.channels,
|
|
r.begin(),
|
|
r.end(),
|
|
width,
|
|
height,
|
|
sun_elevation,
|
|
altitude_f,
|
|
air_density,
|
|
dust_density,
|
|
ozone_density);
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
string SkyLoader::name() const
|
|
{
|
|
return "sky_nishita";
|
|
}
|
|
|
|
bool SkyLoader::equals(const ImageLoader & /*other*/) const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
CCL_NAMESPACE_END
|