You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
Assorted fixes to UV unwrapping and GPU lightmapper
Various fixes to UV2 unwrapping and the GPU lightmapper. Listed here for context in case of git blame/bisect: * Fix UV2 unwrapping on import, also cleaned up the unwrap cache code. * Fix saving of RGBA images in EXR format. * Fixes to the GPU lightmapper: - Added padding between atlas elements, avoids bleeding. - Remove old SDF generation code. - Fix baked attenuation for Omni/Spot lights. - Fix baking of material properties onto UV2 (wireframe was wrongly used before). - Disable statically baked lights for objects that have a lightmap texture to avoid applying the same light twice. - Fix lightmap pairing in RendererSceneCull. - Fix UV2 array generated from `RenderingServer::mesh_surface_get_arrays()`. - Port autoexposure fix for OIDN from 3.x. - Save debug textures as EXR when using floating point format.
This commit is contained in:
103
thirdparty/oidn/core/transfer_function.cpp
vendored
103
thirdparty/oidn/core/transfer_function.cpp
vendored
@@ -24,10 +24,6 @@ namespace oidn {
|
||||
float AutoexposureNode::autoexposure(const Image& color)
|
||||
{
|
||||
assert(color.format == Format::Float3);
|
||||
// -- GODOT start --
|
||||
// We don't want to mess with TTB and we don't use autoexposure, so we disable this code
|
||||
#if 0
|
||||
// -- GODOT end --
|
||||
|
||||
constexpr float key = 0.18f;
|
||||
constexpr float eps = 1e-8f;
|
||||
@@ -42,61 +38,66 @@ namespace oidn {
|
||||
// Compute the average log luminance of the downsampled image
|
||||
using Sum = std::pair<float, int>;
|
||||
|
||||
Sum sum =
|
||||
tbb::parallel_reduce(
|
||||
tbb::blocked_range2d<int>(0, HK, 0, WK),
|
||||
Sum(0.f, 0),
|
||||
[&](const tbb::blocked_range2d<int>& r, Sum sum) -> Sum
|
||||
// -- GODOT start --
|
||||
// Sum sum =
|
||||
// tbb::parallel_reduce(
|
||||
// tbb::blocked_range2d<int>(0, HK, 0, WK),
|
||||
// Sum(0.f, 0),
|
||||
// [&](const tbb::blocked_range2d<int>& r, Sum sum) -> Sum
|
||||
// {
|
||||
// // Iterate over blocks
|
||||
// for (int i = r.rows().begin(); i != r.rows().end(); ++i)
|
||||
// {
|
||||
// for (int j = r.cols().begin(); j != r.cols().end(); ++j)
|
||||
// {
|
||||
|
||||
Sum sum = Sum(0.0f, 0);
|
||||
|
||||
for (int i = 0; i != HK; ++i)
|
||||
{
|
||||
for (int j = 0; j != WK; ++j)
|
||||
{
|
||||
// Compute the average luminance in the current block
|
||||
const int beginH = int(ptrdiff_t(i) * H / HK);
|
||||
const int beginW = int(ptrdiff_t(j) * W / WK);
|
||||
const int endH = int(ptrdiff_t(i+1) * H / HK);
|
||||
const int endW = int(ptrdiff_t(j+1) * W / WK);
|
||||
|
||||
float L = 0.f;
|
||||
|
||||
for (int h = beginH; h < endH; ++h)
|
||||
{
|
||||
// Iterate over blocks
|
||||
for (int i = r.rows().begin(); i != r.rows().end(); ++i)
|
||||
for (int w = beginW; w < endW; ++w)
|
||||
{
|
||||
for (int j = r.cols().begin(); j != r.cols().end(); ++j)
|
||||
{
|
||||
// Compute the average luminance in the current block
|
||||
const int beginH = int(ptrdiff_t(i) * H / HK);
|
||||
const int beginW = int(ptrdiff_t(j) * W / WK);
|
||||
const int endH = int(ptrdiff_t(i+1) * H / HK);
|
||||
const int endW = int(ptrdiff_t(j+1) * W / WK);
|
||||
const float* rgb = (const float*)color.get(h, w);
|
||||
|
||||
float L = 0.f;
|
||||
const float r = maxSafe(rgb[0], 0.f);
|
||||
const float g = maxSafe(rgb[1], 0.f);
|
||||
const float b = maxSafe(rgb[2], 0.f);
|
||||
|
||||
for (int h = beginH; h < endH; ++h)
|
||||
{
|
||||
for (int w = beginW; w < endW; ++w)
|
||||
{
|
||||
const float* rgb = (const float*)color.get(h, w);
|
||||
|
||||
const float r = maxSafe(rgb[0], 0.f);
|
||||
const float g = maxSafe(rgb[1], 0.f);
|
||||
const float b = maxSafe(rgb[2], 0.f);
|
||||
|
||||
L += luminance(r, g, b);
|
||||
}
|
||||
}
|
||||
|
||||
L /= (endH - beginH) * (endW - beginW);
|
||||
|
||||
// Accumulate the log luminance
|
||||
if (L > eps)
|
||||
{
|
||||
sum.first += log2(L);
|
||||
sum.second++;
|
||||
}
|
||||
}
|
||||
L += luminance(r, g, b);
|
||||
}
|
||||
}
|
||||
|
||||
return sum;
|
||||
},
|
||||
[](Sum a, Sum b) -> Sum { return Sum(a.first+b.first, a.second+b.second); },
|
||||
tbb::static_partitioner()
|
||||
);
|
||||
L /= (endH - beginH) * (endW - beginW);
|
||||
|
||||
// Accumulate the log luminance
|
||||
if (L > eps)
|
||||
{
|
||||
sum.first += log2(L);
|
||||
sum.second++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// return sum;
|
||||
// },
|
||||
// [](Sum a, Sum b) -> Sum { return Sum(a.first+b.first, a.second+b.second); },
|
||||
// tbb::static_partitioner()
|
||||
// );
|
||||
// -- GODOT end --
|
||||
|
||||
return (sum.second > 0) ? (key / exp2(sum.first / float(sum.second))) : 1.f;
|
||||
// -- GODOT start --
|
||||
#endif
|
||||
return 1.0;
|
||||
// -- GODOT end --
|
||||
}
|
||||
|
||||
} // namespace oidn
|
||||
|
||||
Reference in New Issue
Block a user