Skip to content

Commit 2ad429c

Browse files
committed
Merge branch 'shader_pipeline_irrlichtbaw' of https://github.com/Devsh-Graphics-Programming/Nabla
2 parents 2012574 + 53a1866 commit 2ad429c

File tree

72 files changed

+7149
-2627
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+7149
-2627
lines changed

examples_tests/18.MitsubaLoader/main.cpp

Lines changed: 99 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ using namespace core;
1515
constexpr const char* GLSL_COMPUTE_LIGHTING =
1616
R"(
1717
#define _IRR_COMPUTE_LIGHTING_DEFINED_
18+
19+
#include <irr/builtin/glsl/format/decode.glsl>
20+
1821
struct SLight
1922
{
2023
vec3 position;
@@ -25,20 +28,43 @@ layout (set = 2, binding = 0, std430) readonly restrict buffer Lights
2528
{
2629
SLight lights[];
2730
};
31+
layout(set = 2, binding = 1) uniform sampler2D envMap;
32+
33+
vec2 SampleSphericalMap(in vec3 v)
34+
{
35+
vec2 uv = vec2(atan(v.z, v.x), asin(v.y));
36+
uv *= irr_glsl_RECIPROCAL_PI*0.5;
37+
uv += 0.5;
38+
return uv;
39+
}
2840
2941
vec3 irr_computeLighting(inout irr_glsl_IsotropicViewSurfaceInteraction out_interaction, in mat2 dUV)
3042
{
31-
vec3 emissive = decodeRGB19E7(InstData.data[InstanceIndex].emissive);
43+
vec3 emissive = irr_glsl_decodeRGB19E7(InstData.data[InstanceIndex].emissive);
3244
33-
irr_glsl_BSDFIsotropicParams params;
3445
vec3 color = vec3(0.0);
46+
/*
47+
instr_stream_t gcs = getGenChoiceStream();
48+
const int N = 100;
49+
for (int i = 0; i < N; ++i)
50+
{
51+
vec3 rem;
52+
vec2 rand;//TODO
53+
vec3 L = runGeneratorChoiceStream(gcs, rand, rem);
54+
vec2 uv = SampleSphericalMap(L);
55+
color += rem*textureLod(envMap, uv, 0.0).xyz;
56+
}
57+
*/
58+
irr_glsl_BSDFIsotropicParams params;
3559
for (int i = 0; i < 13; ++i)
3660
{
3761
SLight l = lights[i];
3862
vec3 L = l.position-WorldPos;
3963
params.L = L;
40-
color += irr_bsdf_cos_eval(params, out_interaction, dUV)*l.intensity*0.01 / dot(L,L);
64+
#define INTENSITY 0.01 //ehh might want to render to hdr fbo and do tonemapping
65+
color += irr_bsdf_cos_eval(params, out_interaction, dUV)*l.intensity*INTENSITY / dot(L,L);
4166
}
67+
4268
return color+emissive;
4369
}
4470
)";
@@ -61,6 +87,33 @@ static core::smart_refctd_ptr<asset::ICPUSpecializedShader> createModifiedFragSh
6187
return fsNew;
6288
}
6389

90+
static auto createGPUImageView(const std::string& path, asset::IAssetManager* am, video::IVideoDriver* driver)
91+
{
92+
using namespace asset;
93+
using namespace video;
94+
95+
IAssetLoader::SAssetLoadParams lp(0ull, nullptr, IAssetLoader::ECF_DONT_CACHE_REFERENCES);
96+
auto cpuTexture = am->getAsset(path, lp);
97+
auto cpuTextureContents = cpuTexture.getContents();
98+
99+
auto asset = *cpuTextureContents.begin();
100+
auto cpuimg = core::smart_refctd_ptr_static_cast<asset::ICPUImage>(asset);
101+
102+
IGPUImageView::SCreationParams viewParams;
103+
viewParams.flags = static_cast<IGPUImageView::E_CREATE_FLAGS>(0u);
104+
viewParams.image = driver->getGPUObjectsFromAssets(&cpuimg.get(),&cpuimg.get()+1u)->front();
105+
viewParams.format = viewParams.image->getCreationParameters().format;
106+
viewParams.viewType = IImageView<IGPUImage>::ET_2D;
107+
viewParams.subresourceRange.baseArrayLayer = 0u;
108+
viewParams.subresourceRange.layerCount = 1u;
109+
viewParams.subresourceRange.baseMipLevel = 0u;
110+
viewParams.subresourceRange.levelCount = viewParams.image->getCreationParameters().mipLevels;
111+
112+
auto gpuImageView = driver->createGPUImageView(std::move(viewParams));
113+
114+
return gpuImageView;
115+
};
116+
64117
#include "irr/irrpack.h"
65118
//std430-compatible
66119
struct SLight
@@ -187,17 +240,27 @@ int main()
187240

188241

189242
video::IVideoDriver* driver = device->getVideoDriver();
243+
asset::IAssetManager* am = device->getAssetManager();
190244

191245
core::smart_refctd_ptr<asset::ICPUDescriptorSetLayout> ds2layout;
192246
{
193-
asset::ICPUDescriptorSetLayout::SBinding bnd;
194-
bnd.binding = 0u;
195-
bnd.count = 1u;
196-
bnd.samplers = nullptr;
197-
bnd.stageFlags = asset::ISpecializedShader::ESS_FRAGMENT;
198-
bnd.type = asset::EDT_STORAGE_BUFFER;
199-
200-
ds2layout = core::make_smart_refctd_ptr<asset::ICPUDescriptorSetLayout>(&bnd, &bnd + 1);
247+
asset::ICPUDescriptorSetLayout::SBinding bnd[2];
248+
bnd[0].binding = 0u;
249+
bnd[0].count = 1u;
250+
bnd[0].samplers = nullptr;
251+
bnd[0].stageFlags = asset::ISpecializedShader::ESS_FRAGMENT;
252+
bnd[0].type = asset::EDT_STORAGE_BUFFER;
253+
254+
using namespace asset;
255+
ISampler::SParams samplerParams = { ISampler::ETC_CLAMP_TO_EDGE, ISampler::ETC_CLAMP_TO_EDGE, ISampler::ETC_CLAMP_TO_EDGE, ISampler::ETBC_FLOAT_OPAQUE_BLACK, ISampler::ETF_LINEAR, ISampler::ETF_LINEAR, ISampler::ESMM_LINEAR, 0u, false, ECO_ALWAYS };
256+
auto smplr = core::make_smart_refctd_ptr<asset::ICPUSampler>(samplerParams);
257+
bnd[1].binding = 1u;
258+
bnd[1].count = 1u;
259+
bnd[1].samplers = &smplr;
260+
bnd[1].stageFlags = asset::ISpecializedShader::ESS_FRAGMENT;
261+
bnd[1].type = asset::EDT_COMBINED_IMAGE_SAMPLER;
262+
263+
ds2layout = core::make_smart_refctd_ptr<asset::ICPUDescriptorSetLayout>(bnd, bnd + 2);
201264
}
202265

203266
//gather all meshes into core::vector and modify their pipelines
@@ -364,20 +427,31 @@ int main()
364427
auto gpuds2layout = driver->getGPUObjectsFromAssets(&ds2layout.get(), &ds2layout.get()+1)->front();
365428
auto gpuds2 = driver->createGPUDescriptorSet(std::move(gpuds2layout));
366429
{
367-
video::IGPUDescriptorSet::SDescriptorInfo info;
368-
video::IGPUDescriptorSet::SWriteDescriptorSet w;
369-
w.arrayElement = 0u;
370-
w.binding = 0u;
371-
w.count = 1u;
372-
w.descriptorType = asset::EDT_STORAGE_BUFFER;
373-
w.dstSet = gpuds2.get();
374-
w.info = &info;
430+
video::IGPUDescriptorSet::SDescriptorInfo info[2];
431+
video::IGPUDescriptorSet::SWriteDescriptorSet w[2];
432+
w[0].arrayElement = 0u;
433+
w[0].binding = 0u;
434+
w[0].count = 1u;
435+
w[0].descriptorType = asset::EDT_STORAGE_BUFFER;
436+
w[0].dstSet = gpuds2.get();
437+
w[0].info = info+0;
375438
auto lightsBuf = driver->createFilledDeviceLocalGPUBufferOnDedMem(lights.size()*sizeof(SLight), lights.data());
376-
info.buffer.offset = 0u;
377-
info.buffer.size = lightsBuf->getSize();
378-
info.desc = std::move(lightsBuf);
379-
380-
driver->updateDescriptorSets(1u, &w, 0u, nullptr);
439+
info[0].buffer.offset = 0u;
440+
info[0].buffer.size = lightsBuf->getSize();
441+
info[0].desc = std::move(lightsBuf);
442+
443+
w[1].arrayElement = 0u;
444+
w[1].binding = 1u;
445+
w[1].count = 1u;
446+
w[1].descriptorType = asset::EDT_COMBINED_IMAGE_SAMPLER;
447+
w[1].dstSet = gpuds2.get();
448+
w[1].info = info+1;
449+
auto gpuEnvmapImageView = createGPUImageView("../../media/envmap/envmap_0.exr", am, driver);
450+
info[1].image.imageLayout = asset::EIL_UNDEFINED;
451+
info[1].image.sampler = nullptr;
452+
info[1].desc = std::move(gpuEnvmapImageView);
453+
454+
driver->updateDescriptorSets(2u, w, 0u, nullptr);
381455
}
382456

383457
// camera and viewport
@@ -399,7 +473,7 @@ int main()
399473
viewport = core::recti(core::position2di(film.cropOffsetX,film.cropOffsetY), core::position2di(film.cropWidth,film.cropHeight));
400474

401475
auto extent = sceneBound.getExtent();
402-
camera = smgr->addCameraSceneNodeFPS(nullptr,100.f,core::min(extent.X,extent.Y,extent.Z)*0.001f);
476+
camera = smgr->addCameraSceneNodeFPS(nullptr,100.f,core::min(extent.X,extent.Y,extent.Z)*0.0001f);
403477
// need to extract individual components
404478
bool leftHandedCamera = false;
405479
{

examples_tests/39.DenoiserTonemapper/CommandLineHandler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ irr::core::matrix3x4SIMD CommandLineHandler::getCameraTransform(uint64_t id)
365365
for (auto j = 0; j < 3u && sit != send; j++)
366366
cameraTransform(i, j) = std::stof(*(sit++));
367367

368+
cameraTransform.rows[1] *= vectorSIMDf(-1.f, -1.f, -1.f, 1.f);
369+
368370
return cameraTransform;
369371
};
370372

examples_tests/39.DenoiserTonemapper/main.cpp

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <irrlicht.h>
55

66
#include "CommandLineHandler.hpp"
7+
#include "irr/asset/filters/dithering/CPrecomputedDither.h"
78

89
#include "../ext/ToneMapper/CToneMapper.h"
910
#include "../../ext/OptiX/Manager.h"
@@ -426,6 +427,7 @@ void main()
426427
uint32_t maxResolution[EII_COUNT][2] = { 0 };
427428
{
428429
asset::IAssetLoader::SAssetLoadParams lp(0ull,nullptr);
430+
429431
for (size_t i=0; i < inputFilesAmount; i++)
430432
{
431433
const auto imageIDString = makeImageIDString(i, colorFileNameBundle);
@@ -988,31 +990,53 @@ void main()
988990
am->writeAsset(outputFileBundle[i].value().c_str(), wp);
989991
}
990992

991-
auto getConvertedPNGImageView = [&](core::smart_refctd_ptr<ICPUImage> image)
993+
auto getConvertedImageView = [&](core::smart_refctd_ptr<ICPUImage> image, const E_FORMAT& outFormat)
992994
{
993-
using CONVERSION_FILTER = CConvertFormatImageFilter<EF_UNKNOWN, EF_UNKNOWN, true>; // TESTING
994-
constexpr auto pngFormat = EF_R8G8B8A8_SRGB;
995+
using CONVERSION_FILTER = CConvertFormatImageFilter<EF_UNKNOWN, EF_UNKNOWN, false, true, asset::CPrecomputedDither>;
995996

996997
core::smart_refctd_ptr<ICPUImage> newConvertedImage;
997998
{
998999
auto referenceImageParams = image->getCreationParameters();
9991000
auto referenceBuffer = image->getBuffer();
10001001
auto referenceRegions = image->getRegions();
10011002
auto referenceRegion = referenceRegions.begin();
1002-
const auto newTexelOrBlockByteSize = asset::getTexelOrBlockBytesize(pngFormat);
1003+
const auto newTexelOrBlockByteSize = asset::getTexelOrBlockBytesize(outFormat);
10031004

10041005
auto newImageParams = referenceImageParams;
10051006
auto newCpuBuffer = core::make_smart_refctd_ptr<ICPUBuffer>(referenceRegion->getExtent().width * referenceRegion->getExtent().height * referenceRegion->getExtent().depth * newTexelOrBlockByteSize);
10061007
auto newRegions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<ICPUImage::SBufferCopy>>(1);
10071008

10081009
*newRegions->begin() = *referenceRegion;
10091010

1010-
newImageParams.format = pngFormat;
1011+
newImageParams.format = outFormat;
10111012
newConvertedImage = ICPUImage::create(std::move(newImageParams));
10121013
newConvertedImage->setBufferAndRegions(std::move(newCpuBuffer), newRegions);
10131014

10141015
CONVERSION_FILTER convertFilter;
10151016
CONVERSION_FILTER::state_type state;
1017+
1018+
auto ditheringBundle = am->getAsset("../../media/blueNoiseDithering/LDR_RGBA.png", {});
1019+
const auto ditheringStatus = ditheringBundle.isEmpty();
1020+
if (ditheringStatus)
1021+
{
1022+
os::Printer::log("ERROR (" + std::to_string(__LINE__) + " line): Could not load the dithering image!", ELL_ERROR);
1023+
assert(ditheringStatus);
1024+
}
1025+
auto ditheringImage = core::smart_refctd_ptr_static_cast<asset::ICPUImage>(ditheringBundle.getContents().begin()[0]);
1026+
1027+
ICPUImageView::SCreationParams imageViewInfo;
1028+
imageViewInfo.image = ditheringImage;
1029+
imageViewInfo.format = ditheringImage->getCreationParameters().format;
1030+
imageViewInfo.viewType = decltype(imageViewInfo.viewType)::ET_2D;
1031+
imageViewInfo.components = {};
1032+
imageViewInfo.flags = static_cast<ICPUImageView::E_CREATE_FLAGS>(0u);
1033+
imageViewInfo.subresourceRange.baseArrayLayer = 0u;
1034+
imageViewInfo.subresourceRange.baseMipLevel = 0u;
1035+
imageViewInfo.subresourceRange.layerCount = ditheringImage->getCreationParameters().arrayLayers;
1036+
imageViewInfo.subresourceRange.levelCount = ditheringImage->getCreationParameters().mipLevels;
1037+
1038+
auto ditheringImageView = ICPUImageView::create(std::move(imageViewInfo));
1039+
state.ditherState = _IRR_NEW(std::remove_pointer<decltype(state.ditherState)>::type, ditheringImageView.get());
10161040

10171041
state.inImage = image.get();
10181042
state.outImage = newConvertedImage.get();
@@ -1030,6 +1054,8 @@ void main()
10301054

10311055
if (!convertFilter.execute(&state))
10321056
os::Printer::log("WARNING (" + std::to_string(__LINE__) + " line): Something went wrong while converting the image!", ELL_WARNING);
1057+
1058+
_IRR_DELETE(state.ditherState);
10331059
}
10341060

10351061
// create image view
@@ -1044,21 +1070,19 @@ void main()
10441070
return newImageView;
10451071
};
10461072

1047-
//#if 0 // @Anastazluk uncomment when dither and clamp is done
1048-
// convert to .PNG and save it as well
1073+
// convert to EF_R8G8B8_SRGB and save it as .png and .jpg
10491074
{
1050-
auto newImageView = getConvertedPNGImageView(imageView->getCreationParameters().image);
1075+
auto newImageView = getConvertedImageView(imageView->getCreationParameters().image, EF_R8G8B8_SRGB);
10511076
IAssetWriter::SAssetWriteParams wp(newImageView.get());
10521077
std::string fileName = outputFileBundle[i].value().c_str();
10531078

10541079
while (fileName.back() != '.')
10551080
fileName.pop_back();
10561081

1057-
fileName += "png";
1058-
1059-
am->writeAsset(fileName, wp);
1082+
const std::string& nonFormatFileName = fileName;
1083+
am->writeAsset(nonFormatFileName + "png", wp);
1084+
am->writeAsset(nonFormatFileName + "jpg", wp);
10601085
}
1061-
//#endif
10621086

10631087
// destroy link to CPUBuffer's data (we need to free it)
10641088
imageView->convertToDummyObject(~0u);

examples_tests/42.FragmentShaderPathTracer/common.glsl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// basic settings
22
#define MAX_DEPTH 8
3-
#define SAMPLES 16
3+
#define SAMPLES 128
44

55
// firefly and variance reduction techniques
66
//#define KILL_DIFFUSE_SPECULAR_PATHS
@@ -322,7 +322,6 @@ void missProgram()
322322
rayStack[stackPtr]._payload.accumulation += finalContribution;
323323
}
324324

325-
#include <irr/builtin/glsl/bxdf/brdf/cos_weighted_sample.glsl>
326325
#include <irr/builtin/glsl/bxdf/brdf/diffuse/oren_nayar.glsl>
327326
#include <irr/builtin/glsl/bxdf/brdf/specular/ggx.glsl>
328327
#include <irr/builtin/glsl/bxdf/bsdf/specular/dielectric.glsl>

examples_tests/42.FragmentShaderPathTracer/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ int main()
250250
return { gpuPipeline, gpuMeshBuffer };
251251
};
252252

253-
constexpr bool litByTriangle = true;
253+
constexpr bool litByTriangle = false;
254254
auto gpuEnvmapResources = createGpuResources(litByTriangle ? "../litByTriangle.frag":"../litBySphere.frag");
255255
auto gpuEnvmapPipeline = gpuEnvmapResources.first;
256256
auto gpuEnvmapMeshBuffer = gpuEnvmapResources.second;

examples_tests/43A.SumAndCDFFilters/main.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ using namespace video;
2222
*/
2323

2424
// #define IMAGE_VIEW
25-
// #define OVERLAPPING_REGIONS // @devsh I leave it for you
25+
// #define OVERLAPPING_REGIONS
2626
constexpr bool EXCLUSIVE_SUM = true;
2727
constexpr auto MIPMAP_IMAGE_VIEW = 2u; // feel free to change the mipmap
2828
constexpr auto MIPMAP_IMAGE = 0u; // ordinary image used in the example has only 0-th mipmap
@@ -268,7 +268,7 @@ int main()
268268
{
269269
auto outImage = core::move_and_static_cast<ICPUImage>(inImage->clone());
270270

271-
using DISCRETE_CONVOLUTION_BLIT_FILTER = asset::CBlitImageFilter<CDiscreteConvolutionFilterKernel,CDiscreteConvolutionFilterKernel,CBoxImageFilterKernel>;
271+
using DISCRETE_CONVOLUTION_BLIT_FILTER = asset::CBlitImageFilter<false,true,DefaultSwizzle,CWhiteNoiseDither,CDiscreteConvolutionFilterKernel,CDiscreteConvolutionFilterKernel,CBoxImageFilterKernel>;
272272
DISCRETE_CONVOLUTION_BLIT_FILTER blitImageFilter;
273273
DISCRETE_CONVOLUTION_BLIT_FILTER::state_type state;
274274

@@ -291,12 +291,16 @@ int main()
291291
state.outExtentLayerCount = extentLayerCount;
292292
state.outImage = outImage.get();
293293

294+
state.swizzle = {};
295+
296+
state.ditherState = _IRR_NEW(std::remove_pointer<decltype(state.ditherState)>::type);
294297
state.scratchMemoryByteSize = blitImageFilter.getRequiredScratchByteSize(&state);
295298
state.scratchMemory = reinterpret_cast<uint8_t*>(_IRR_ALIGNED_MALLOC(state.scratchMemoryByteSize, 32));
296299

297300
if (!blitImageFilter.execute(&state))
298301
os::Printer::log("Something went wrong while performing discrete convolution operation!", ELL_WARNING);
299302

303+
_IRR_DELETE(state.ditherState);
300304
_IRR_ALIGNED_FREE(state.scratchMemory);
301305

302306
return outImage;

0 commit comments

Comments
 (0)