Skip to content

Commit 5ca7fa9

Browse files
committed
Normal maps should be fully operational now
Im a little worried theres so much black (with or without normal maps integrated)
1 parent 4dba268 commit 5ca7fa9

File tree

7 files changed

+98
-15
lines changed

7 files changed

+98
-15
lines changed

include/nbl/asset/filters/CNormalMapToDerivativeFilter.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ class CNormalMapToDerivativeFilter : public CMatchedSizeInOutImageFilterCommon,
108108
CStateBase() = default;
109109
virtual ~CStateBase() = default;
110110

111+
using override_normalization_factor_t = std::function<void(float*)>;
112+
override_normalization_factor_t override_normalization_factor;
113+
111114
private:
112115

113116
void setLayerScaleValuesOffset()
@@ -239,6 +242,11 @@ class CNormalMapToDerivativeFilter : public CMatchedSizeInOutImageFilterCommon,
239242
CBasicImageFilterCommon::executePerRegion(state->inImage, decodeAndDivide, inRegions.begin(), inRegions.end(), clipFunctor);
240243
}
241244

245+
if (state->override_normalization_factor)
246+
{
247+
state->override_normalization_factor(decodeAbsValuesOffset);
248+
}
249+
242250
{
243251
auto getScratchPixel = [&](core::vector4di32_SIMD readBlockPos) -> CNormalMapToDerivativeFilterBase<Swizzle, Dither>::CNormalMapToDerivativeStateBase::decodeType*
244252
{

include/nbl/asset/utils/CDerivativeMapCreator.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ class CDerivativeMapCreator
1818
static core::smart_refctd_ptr<asset::ICPUImage> createDerivativeMapFromHeightMap(asset::ICPUImage* _inImg, asset::ISampler::E_TEXTURE_CLAMP _uwrap, asset::ISampler::E_TEXTURE_CLAMP _vwrap, asset::ISampler::E_TEXTURE_BORDER_COLOR _borderColor);
1919
static core::smart_refctd_ptr<asset::ICPUImageView> createDerivativeMapViewFromHeightMap(asset::ICPUImage* _inImg, asset::ISampler::E_TEXTURE_CLAMP _uwrap, asset::ISampler::E_TEXTURE_CLAMP _vwrap, asset::ISampler::E_TEXTURE_BORDER_COLOR _borderColor);
2020

21-
static core::smart_refctd_ptr<asset::ICPUImage> createDerivativeMapFromNormalMap(asset::ICPUImage* _inImg);
22-
static core::smart_refctd_ptr<asset::ICPUImageView> createDerivativeMapViewFromNormalMap(asset::ICPUImage* _inImg);
21+
//! `oneNormFactor` makes filter to use max value of all channels for normalization instead of per-channel max
22+
//! Normalization is always done per-layer
23+
static core::smart_refctd_ptr<asset::ICPUImage> createDerivativeMapFromNormalMap(asset::ICPUImage* _inImg, float out_normalizationFactor[2], bool oneNormFactor = false);
24+
static core::smart_refctd_ptr<asset::ICPUImageView> createDerivativeMapViewFromNormalMap(asset::ICPUImage* _inImg, float out_normalizationFactor[2], bool oneNormFactor = false);
2325

2426
private:
2527

include/nbl/ext/MitsubaLoader/CMitsubaMetadata.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ class CMitsubaMetadata : public asset::IAssetMetadata
3131
public:
3232
std::string m_id;
3333
};
34+
class CDerivativeMap : public asset::IImageMetadata
35+
{
36+
public:
37+
CDerivativeMap() : m_scale(1.f) {}
38+
explicit CDerivativeMap(float scale) : m_scale(scale) {}
39+
40+
float m_scale;
41+
};
3442
class CRenderpassIndependentPipeline : public asset::IRenderpassIndependentPipelineMetadata
3543
{
3644
public:
@@ -131,6 +139,9 @@ class CMitsubaMetadata : public asset::IAssetMetadata
131139
CMesh::SInstance* m_instanceStorageIt;
132140
CMesh::SInstanceAuxilaryData* m_instanceAuxStorageIt;
133141

142+
meta_container_t<CDerivativeMap> m_metaDerivMapStorage;
143+
CDerivativeMap* m_metaDerivMapStorageIt;
144+
134145
inline void reservePplnStorage(uint32_t pplnCount, core::smart_refctd_dynamic_array<asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>&& _semanticStorage)
135146
{
136147
m_metaPplnStorage = IAssetMetadata::createContainer<CRenderpassIndependentPipeline>(pplnCount);
@@ -146,6 +157,11 @@ class CMitsubaMetadata : public asset::IAssetMetadata
146157
m_instanceStorageIt = m_metaMeshInstanceStorage->begin();
147158
m_instanceAuxStorageIt = m_metaMeshInstanceAuxStorage->begin();
148159
}
160+
inline void reserveDerivMapStorage(uint32_t count)
161+
{
162+
m_metaDerivMapStorage = IAssetMetadata::createContainer<CDerivativeMap>(count);
163+
m_metaDerivMapStorageIt = m_metaDerivMapStorage->begin();
164+
}
149165
inline void addPplnMeta(const asset::ICPURenderpassIndependentPipeline* ppln, core::smart_refctd_ptr<asset::ICPUDescriptorSet>&& _ds0)
150166
{
151167
*m_metaPplnStorageIt = CMitsubaMetadata::CRenderpassIndependentPipeline(std::move(_ds0),core::SRange<const asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>(m_semanticStorage->begin(),m_semanticStorage->end()));
@@ -183,6 +199,12 @@ class CMitsubaMetadata : public asset::IAssetMetadata
183199

184200
return meta->m_instances.size();
185201
}
202+
inline void addDerivMapMeta(const asset::ICPUImage* derivmap, float scale)
203+
{
204+
auto* meta = m_metaDerivMapStorageIt++;
205+
meta->m_scale = scale;
206+
IAssetMetadata::insertAssetSpecificMetadata(derivmap, meta);
207+
}
186208
};
187209

188210
}

include/nbl/ext/MitsubaLoader/SContext.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ namespace MitsubaLoader
4949
core::map<const CElementShape*, shape_ass_type> shapeCache;
5050
//image, sampler
5151
using tex_ass_type = std::tuple<core::smart_refctd_ptr<asset::ICPUImageView>, core::smart_refctd_ptr<asset::ICPUSampler>>;
52+
//image, scale
53+
core::map<core::smart_refctd_ptr<asset::ICPUImage>, float> derivMapCache;
5254

5355
static std::string blendWeightImageCacheKey(const CElementTexture* bitmap)
5456
{

src/nbl/asset/utils/CDerivativeMapCreator.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ core::smart_refctd_ptr<asset::ICPUImageView> CDerivativeMapCreator::createDeriva
212212
return asset::ICPUImageView::create(std::move(params));
213213
}
214214

215-
core::smart_refctd_ptr<asset::ICPUImage> nbl::asset::CDerivativeMapCreator::createDerivativeMapFromNormalMap(asset::ICPUImage* _inImg)
215+
core::smart_refctd_ptr<asset::ICPUImage> nbl::asset::CDerivativeMapCreator::createDerivativeMapFromNormalMap(asset::ICPUImage* _inImg, float out_normalizationFactor[2], bool oneNormFactor/* = false*/)
216216
{
217217
core::smart_refctd_ptr<ICPUImage> newDerivativeNormalMapImage;
218218
{
@@ -248,6 +248,13 @@ core::smart_refctd_ptr<asset::ICPUImage> nbl::asset::CDerivativeMapCreator::crea
248248
using DerivativeNormalMapFilter = CNormalMapToDerivativeFilter<asset::DefaultSwizzle, asset::IdentityDither>;
249249
DerivativeNormalMapFilter derivativeNormalFilter;
250250
DerivativeNormalMapFilter::state_type state;
251+
DerivativeNormalMapFilter::state_type::override_normalization_factor_t normalizationFactorOverride =
252+
[](float inout_nfactor[2]) -> void
253+
{
254+
const float mx = std::max(inout_nfactor[0], inout_nfactor[1]);
255+
inout_nfactor[0] = mx;
256+
inout_nfactor[1] = mx;
257+
};
251258

252259
state.inImage = cpuImageNormalTexture;
253260
state.outImage = newDerivativeNormalMapImage.get();
@@ -264,17 +271,31 @@ core::smart_refctd_ptr<asset::ICPUImage> nbl::asset::CDerivativeMapCreator::crea
264271
state.inMipLevel = 0;
265272
state.outMipLevel = 0;
266273

267-
if (!derivativeNormalFilter.execute(&state))
268-
os::Printer::log("Something went wrong while performing derivative filter operations!", ELL_ERROR);
274+
if (oneNormFactor)
275+
state.override_normalization_factor = std::move(normalizationFactorOverride);
276+
277+
const bool result = derivativeNormalFilter.execute(&state);
278+
if (result)
279+
{
280+
auto factor = state.getAbsoluteLayerScaleValues(0u);
281+
out_normalizationFactor[0] = factor.x;
282+
out_normalizationFactor[1] = factor.y;
283+
}
269284

270285
_NBL_ALIGNED_FREE(state.scratchMemory);
271286

287+
if (!result)
288+
{
289+
os::Printer::log("Something went wrong while performing derivative filter operations!", ELL_ERROR);
290+
return nullptr;
291+
}
292+
272293
return core::smart_refctd_ptr<ICPUImage>(state.outImage);
273294
}
274295

275-
core::smart_refctd_ptr<asset::ICPUImageView> nbl::asset::CDerivativeMapCreator::createDerivativeMapViewFromNormalMap(asset::ICPUImage* _inImg)
296+
core::smart_refctd_ptr<asset::ICPUImageView> nbl::asset::CDerivativeMapCreator::createDerivativeMapViewFromNormalMap(asset::ICPUImage* _inImg, float out_normalizationFactor[2], bool oneNormFactor/* = false*/)
276297
{
277-
auto cpuDerivativeImage = createDerivativeMapFromNormalMap(_inImg);
298+
auto cpuDerivativeImage = createDerivativeMapFromNormalMap(_inImg, out_normalizationFactor, oneNormFactor);
278299

279300
ICPUImageView::SCreationParams imageViewInfo;
280301
imageViewInfo.image = core::smart_refctd_ptr(cpuDerivativeImage);

src/nbl/ext/MitsubaLoader/CMitsubaLoader.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -270,18 +270,32 @@ static core::smart_refctd_ptr<asset::ICPUImageView> createImageView(core::smart_
270270

271271
return asset::ICPUImageView::create(std::move(params));
272272
}
273-
static core::smart_refctd_ptr<asset::ICPUImage> createDerivMap(asset::ICPUImage* _heightMap, asset::ICPUSampler* _smplr, bool fromNormalMap)
273+
static core::smart_refctd_ptr<asset::ICPUImage> createDerivMap(SContext& ctx, asset::ICPUImage* _heightMap, asset::ICPUSampler* _smplr, bool fromNormalMap)
274274
{
275275
const auto& sp = _smplr->getParams();
276276

277-
if (fromNormalMap) // TODO: use the normalmap to derivative map filter and utils from the glTF PR
278-
os::Printer::log("Normalmaps not implemented yet! Treating with Bumpmap creation pipeline, expect results to be off!",ELL_ERROR);
279-
return asset::CDerivativeMapCreator::createDerivativeMapFromHeightMap(
277+
core::smart_refctd_ptr<asset::ICPUImage> derivmap_img;
278+
float scale[2]{ 1.f, 1.f };
279+
if (fromNormalMap)
280+
{
281+
derivmap_img = asset::CDerivativeMapCreator::createDerivativeMapFromNormalMap(_heightMap, scale, true);
282+
assert(scale[0] == scale[1]);
283+
}
284+
else
285+
{
286+
derivmap_img = asset::CDerivativeMapCreator::createDerivativeMapFromHeightMap(
280287
_heightMap,
281288
static_cast<asset::ICPUSampler::E_TEXTURE_CLAMP>(sp.TextureWrapU),
282289
static_cast<asset::ICPUSampler::E_TEXTURE_CLAMP>(sp.TextureWrapV),
283-
static_cast<asset::ICPUSampler::E_TEXTURE_BORDER_COLOR>(sp.BorderColor)
284-
);
290+
static_cast<asset::ICPUSampler::E_TEXTURE_BORDER_COLOR>(sp.BorderColor));
291+
}
292+
293+
if (!derivmap_img)
294+
return nullptr;
295+
296+
ctx.derivMapCache.insert({ derivmap_img, scale[0] });
297+
298+
return derivmap_img;
285299
}
286300
static core::smart_refctd_ptr<asset::ICPUImage> createBlendWeightImage(const asset::ICPUImage* _img)
287301
{
@@ -537,6 +551,12 @@ asset::SAssetBundle CMitsubaLoader::loadAsset(io::IReadFile* _file, const asset:
537551
ctx.meta->m_global.m_materialCompilerGLSL_source = compResult.fragmentShaderSource;
538552
ctx.meta->m_global.m_ds0 = ds0;
539553

554+
ctx.meta->reserveDerivMapStorage(ctx.derivMapCache.size());
555+
for (auto& derivMap : ctx.derivMapCache)
556+
{
557+
ctx.meta->addDerivMapMeta(derivMap.first.get(), derivMap.second);
558+
}
559+
540560
auto meshSmartPtrArray = core::make_refctd_dynamic_array<SAssetBundle::contents_container_t>(meshes.size());
541561
auto meshSmartPtrArrayIt = meshSmartPtrArray->begin();
542562
for (const auto& mesh_ : meshes)
@@ -1279,8 +1299,8 @@ auto CMitsubaLoader::genBSDFtreeTraversal(SContext& ctx, const CElementBSDF* _bs
12791299

12801300
if (!getBuiltinAsset<asset::ICPUImage, asset::IAsset::ET_IMAGE>(key.c_str(), m_assetMgr))
12811301
{
1282-
// TODO: @Crisspl retrieve the normalization factor from the deriv map filter, then adjust the scale accordingly!
1283-
auto derivmap = createDerivMap(bumpmap.get(),sampler.get(),wasNormal);
1302+
printf("%s\n", bumpmap_element->id.c_str());
1303+
auto derivmap = createDerivMap(ctx, bumpmap.get(),sampler.get(),wasNormal);
12841304
asset::SAssetBundle imgBundle(nullptr,{ derivmap });
12851305
ctx.override_->insertAssetIntoCache(std::move(imgBundle), key, ctx.inner, 0u);
12861306
auto derivmap_view = createImageView(std::move(derivmap));

src/nbl/ext/MitsubaLoader/CMitsubaMaterialCompilerFrontend.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ namespace MitsubaLoader
6767
if (!viewBundle.getContents().empty())
6868
{
6969
auto view = core::smart_refctd_ptr_static_cast<asset::ICPUImageView>(viewBundle.getContents().begin()[0]);
70+
71+
auto found = m_loaderContext->derivMapCache.find(view->getCreationParameters().image);
72+
if (found != m_loaderContext->derivMapCache.end())
73+
{
74+
const float normalizationFactor = found->second;
75+
_scale *= normalizationFactor;
76+
}
77+
7078
types[0] = asset::IAsset::ET_SAMPLER;
7179
auto samplerBundle = m_loaderContext->override_->findCachedAsset(samplerKey, types, m_loaderContext->inner, 0u);
7280
assert(!samplerBundle.getContents().empty());

0 commit comments

Comments
 (0)