Skip to content

Commit 86c62fe

Browse files
committed
Merge with devsh/raytracing
2 parents eecdfd7 + 5947dd0 commit 86c62fe

30 files changed

+757
-717
lines changed

cmake/common.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ macro(nbl_create_executable_project _EXTRA_SOURCES _EXTRA_OPTIONS _EXTRA_INCLUDE
155155
endmacro()
156156

157157
macro(nbl_create_ext_library_project EXT_NAME LIB_HEADERS LIB_SOURCES LIB_INCLUDES LIB_OPTIONS)
158-
set(LIB_NAME "IrrExt${EXT_NAME}")
158+
set(LIB_NAME "NblExt${EXT_NAME}")
159159
project(${LIB_NAME})
160160

161161
add_library(${LIB_NAME} ${LIB_SOURCES})

examples_tests/18.MitsubaLoader/main.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,25 +58,25 @@ vec2 SampleSphericalMap(in vec3 v)
5858
return uv;
5959
}
6060
61-
vec3 nbl_computeLighting(inout nbl_glsl_IsotropicViewSurfaceInteraction out_interaction, in mat2 dUV, in nbl_glsl_MC_precomputed_t precomp)
61+
vec3 nbl_computeLighting(inout nbl_glsl_AnisotropicViewSurfaceInteraction out_interaction, in mat2 dUV)
6262
{
6363
nbl_glsl_xoroshiro64star_state_t scramble_start_state = textureLod(scramblebuf,gl_FragCoord.xy/VIEWPORT_SZ,0).rg;
6464
65-
vec3 emissive = nbl_glsl_decodeRGB19E7(InstData.data[InstanceIndex].emissive);
65+
vec3 emissive = nbl_glsl_MC_oriented_material_t_getEmissive(material);
6666
6767
vec3 color = vec3(0.0);
6868
6969
#ifdef USE_ENVMAP
70-
nbl_glsl_instr_stream_t gcs = getGenChoiceStream(precomp);
71-
nbl_glsl_instr_stream_t rnps = getRemAndPdfStream(precomp);
70+
nbl_glsl_MC_instr_stream_t gcs = nbl_glsl_MC_oriented_material_t_getGenChoiceStream(material);
71+
nbl_glsl_MC_instr_stream_t rnps = nbl_glsl_MC_oriented_material_t_getRemAndPdfStream(material);
7272
for (int i = 0; i < SAMPLE_COUNT; ++i)
7373
{
7474
nbl_glsl_xoroshiro64star_state_t scramble_state = scramble_start_state;
7575
7676
vec3 rand = rand3d(i,scramble_state);
7777
float pdf;
7878
nbl_glsl_LightSample s;
79-
vec3 rem = nbl_glsl_runGenerateAndRemainderStream(precomp, gcs, rnps, rand, pdf, s);
79+
vec3 rem = nbl_glsl_MC_runGenerateAndRemainderStream(precomp, gcs, rnps, rand, pdf, s);
8080
8181
vec2 uv = SampleSphericalMap(s.L);
8282
color += rem*textureLod(envMap, uv, 0.0).xyz;
@@ -87,10 +87,12 @@ vec3 nbl_computeLighting(inout nbl_glsl_IsotropicViewSurfaceInteraction out_inte
8787
for (int i = 0; i < LIGHT_COUNT; ++i)
8888
{
8989
SLight l = lights[i];
90-
vec3 L = l.position-WorldPos;
91-
//params.L = L;
90+
const vec3 L = l.position-WorldPos;
91+
const float d2 = dot(L,L);
9292
const float intensityScale = LIGHT_INTENSITY_SCALE;//ehh might want to render to hdr fbo and do tonemapping
93-
color += nbl_bsdf_cos_eval(precomp, normalize(L), out_interaction, dUV)*l.intensity*intensityScale / dot(L,L);
93+
nbl_glsl_LightSample _sample;
94+
_sample.L = L*inversesqrt(d2);
95+
color += nbl_bsdf_cos_eval(_sample,out_interaction, dUV)*l.intensity*intensityScale/d2;
9496
}
9597
9698
return color+emissive;
@@ -209,7 +211,7 @@ int main()
209211
asset::CQuantNormalCache* qnc = am->getMeshManipulator()->getQuantNormalCache();
210212

211213
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CSerializedLoader>(am));
212-
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am));
214+
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am,fs));
213215

214216
std::string filePath = "../../media/mitsuba/staircase2.zip";
215217
//#define MITSUBA_LOADER_TESTS
@@ -320,6 +322,11 @@ int main()
320322
video::IVideoDriver* driver = device->getVideoDriver();
321323
asset::IAssetManager* am = device->getAssetManager();
322324

325+
// look out for this!!!
326+
// when added, CMitsubaLoader inserts its own include loader into GLSLCompiler
327+
// thats why i have to add it again here (after device recreation) to be able to compile shaders
328+
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am, device->getFileSystem()));
329+
323330
core::smart_refctd_ptr<asset::ICPUDescriptorSetLayout> ds2layout;
324331
{
325332
asset::ICPUDescriptorSetLayout::SBinding bnd[4];

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -657,21 +657,7 @@ void Renderer::init(const SAssetBundle& meshes,
657657
core::smart_refctd_ptr(m_raygenDSLayout),
658658
nullptr
659659
);
660-
#ifdef TODO
661-
{
662-
std::string glsl = "raygen.comp" +
663-
globalMeta->materialCompilerGLSL_declarations +
664-
// TODO ds0 descriptors and user-defined functions required by material compiler
665-
globalMeta->materialCompilerGLSL_source;
666-
667-
auto shader = m_driver->createGPUShader(core::make_smart_refctd_ptr<asset::ICPUShader>(glsl.c_str()));
668-
asset::ISpecializedShader::SInfo info(nullptr, nullptr, "main", asset::ISpecializedShader::ESS_COMPUTE);
669-
auto spec = m_driver->createGPUSpecializedShader(shader.get(), info);
670-
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr, core::smart_refctd_ptr(m_raygenLayout), std::move(spec));
671-
}
672-
#endif
673-
(std::ofstream("material_declarations.glsl") << initData.globalMeta->materialCompilerGLSL_declarations).close();
674-
(std::ofstream("material_source.glsl") << initData.globalMeta->materialCompilerGLSL_source).close();
660+
(std::ofstream("material_declarations.glsl") << "#define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << initData.globalMeta->getVTStorageViewCount() << "\n" << initData.globalMeta->materialCompilerGLSL_declarations).close();
675661
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr, core::smart_refctd_ptr(m_raygenPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../raygen.comp"));
676662

677663
m_raygenDS = m_driver->createGPUDescriptorSet(core::smart_refctd_ptr(m_raygenDSLayout));
@@ -816,7 +802,13 @@ void Renderer::init(const SAssetBundle& meshes,
816802
auto resolveInfos = infos+descriptorExclScanSum[2];
817803
auto resolveWrites = writes+descriptorExclScanSum[2];
818804
createEmptyInteropBufferAndSetUpInfo(resolveInfos+0,m_intersectionBuffer,intersectionBufferSize);
819-
setImageInfo(resolveInfos+1,asset::EIL_GENERAL,core::smart_refctd_ptr(m_tonemapOutput));
805+
core::smart_refctd_ptr<IGPUImageView> tonemapOutputStorageView;
806+
{
807+
IGPUImageView::SCreationParams viewparams = m_tonemapOutput->getCreationParameters();
808+
viewparams.format = EF_R32_UINT;
809+
tonemapOutputStorageView = m_driver->createGPUImageView(std::move(viewparams));
810+
}
811+
setImageInfo(resolveInfos+1,asset::EIL_GENERAL,std::move(tonemapOutputStorageView));
820812

821813

822814
setDstSetAndDescTypesOnWrites(m_resolveDS.get(),resolveWrites,resolveInfos,{EDT_STORAGE_BUFFER,EDT_STORAGE_IMAGE});
@@ -993,7 +985,8 @@ void Renderer::render(nbl::ITimer* timer)
993985

994986
const auto currentViewProj = camera->getConcatenatedMatrix();
995987
// TODO: instead of rasterizing vis-buffer only once, subpixel jitter it to obtain AA
996-
if (!core::equals(prevViewProj,currentViewProj,core::ROUNDING_ERROR<core::matrix4SIMD>()*1000.0))
988+
const auto thresh = core::ROUNDING_ERROR<core::matrix4SIMD>()*128.f;
989+
if (!core::equals(prevViewProj,currentViewProj,thresh))
997990
{
998991
m_raytraceCommonData.framesDispatched = 0u;
999992

@@ -1010,6 +1003,11 @@ void Renderer::render(nbl::ITimer* timer)
10101003
m_driver->dispatch(m_cullWorkGroups, 1u, 1u);
10111004
COpenGLExtensionHandler::pGlMemoryBarrier(GL_COMMAND_BARRIER_BIT|GL_SHADER_STORAGE_BARRIER_BIT);
10121005

1006+
m_driver->setRenderTarget(tmpTonemapBuffer);
1007+
{
1008+
uint32_t clearAccumulation[4] = { 0,0,0,0 };
1009+
m_driver->clearColorBuffer(EFAP_COLOR_ATTACHMENT0, clearAccumulation);
1010+
}
10131011
m_driver->setRenderTarget(m_visibilityBuffer);
10141012
{ // clear
10151013
m_driver->clearZBuffer();
@@ -1103,7 +1101,7 @@ void Renderer::render(nbl::ITimer* timer)
11031101
m_driver->bindComputePipeline(m_resolvePipeline.get());
11041102
m_driver->dispatch(m_resolveWorkGroups[0], m_resolveWorkGroups[1], 1);
11051103

1106-
COpenGLExtensionHandler::pGlMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT
1104+
COpenGLExtensionHandler::pGlMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT|GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
11071105
#ifndef _NBL_BUILD_OPTIX_
11081106
|GL_FRAMEBUFFER_BARRIER_BIT|GL_TEXTURE_UPDATE_BARRIER_BIT
11091107
#else

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ int main()
4343
asset::IAssetManager* am = device->getAssetManager();
4444

4545
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CSerializedLoader>(am));
46-
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am));
46+
am->addAssetLoader(core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am, fs));
4747

4848
//std::string filePath = "../../media/mitsuba/daily_pt.xml";
4949
std::string filePath = "../../media/mitsuba/staircase2.zip";

examples_tests/22.RaytracedAO/raygen.comp

Lines changed: 33 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#version 430 core
22
#include "raytraceCommon.glsl"
33

4+
// for per pixel inputs
45
#include <nbl/builtin/glsl/utils/normal_decode.glsl>
56
#include <nbl/builtin/glsl/random/xoroshiro.glsl>
67

@@ -10,13 +11,22 @@ layout(set = 2, binding = 1) uniform usampler2D scramblebuf;
1011
// vis buffer
1112
layout(set = 2, binding = 2) uniform sampler2D depthbuf;
1213
layout(set = 2, binding = 3) uniform usampler2D frontFacing_Object_Triangle;
14+
//layout(set = 2, binding = 3) uniform sampler2D barycentricDerivatives;
1315
layout(set = 2, binding = 4) uniform sampler2D encodedNormal;
1416
layout(set = 2, binding = 5) uniform sampler2D uvCoords;
1517

1618

17-
// no idea yet
18-
#define sizeof_bsdf_data 1u // wtf??? it's not supposed to be user-defined
19-
#include <nbl/builtin/glsl/material_compiler/common_declarations.glsl>
19+
#include "bin/material_declarations.glsl"
20+
21+
/*
22+
// something to get our GLSL intellisense to "shut up"
23+
#ifndef _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT
24+
#define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT 4
25+
#include <nbl/builtin/glsl/virtual_texturing/impl_functions.glsl>
26+
#endif
27+
*/
28+
#include <nbl/builtin/glsl/ext/MitsubaLoader/material_compiler_compatibility_impl.glsl>
29+
2030
vec3 normalizedV;
2131
vec3 nbl_glsl_MC_getNormalizedWorldSpaceV()
2232
{
@@ -32,92 +42,13 @@ vec3 nbl_glsl_MC_getWorldSpacePosition()
3242
{
3343
return worldPosition;
3444
}
45+
mat2x3 dPosdScreen = mat2x3(vec3(0.0),vec3(0.0)); // TODO
3546
mat2x3 nbl_glsl_MC_getdPos(in vec3 p)
3647
{
37-
return mat2x3(vec3(0.0/0.0), vec3(0.0/0.0));
38-
}
39-
/*
40-
#define _IRR_USER_PROVIDED_MATERIAL_COMPILER_GLSL_BACKEND_FUNCTIONS_
41-
instr_stream_t getEvalStream(in MC_precomputed_t precomp)
42-
{
43-
instr_stream_t stream;
44-
if (precomp.frontface)
45-
{
46-
stream.offset = InstData.data[InstanceIndex].front_instr_offset;
47-
stream.count = InstData.data[InstanceIndex].front_rem_pdf_count;
48-
}
49-
else
50-
{
51-
stream.offset = InstData.data[InstanceIndex].back_instr_offset;
52-
stream.count = InstData.data[InstanceIndex].back_rem_pdf_count;
53-
}
54-
return stream;
55-
}
56-
instr_t nbl_glsl_MC_fetchInstr(in uint ix)
57-
{
58-
return instr_buf.data[ix];
59-
}
60-
prefetch_instr_t nbl_glsl_MC_fetchPrefetchInstr(in uint ix)
61-
{
62-
return prefetch_instr_buf.data[ix];
63-
}
64-
bsdf_data_t nbl_glsl_MC_fetchBSDFData(in uint ix)
65-
{
66-
return bsdf_buf.data[ix];
67-
}
68-
///
69-
//rem'n'pdf and eval use the same instruction stream
70-
instr_stream_t getRemAndPdfStream(in MC_precomputed_t precomp)
71-
{
72-
return getEvalStream(precomp);
73-
}
74-
instr_stream_t getGenChoiceStream(in MC_precomputed_t precomp)
75-
{
76-
instr_stream_t stream;
77-
if (precomp.frontface)
78-
{
79-
stream.offset = InstData.data[InstanceIndex].front_instr_offset + InstData.data[InstanceIndex].front_rem_pdf_count;
80-
stream.count = InstData.data[InstanceIndex].front_genchoice_count;
81-
}
82-
else
83-
{
84-
stream.offset = InstData.data[InstanceIndex].back_instr_offset + InstData.data[InstanceIndex].back_rem_pdf_count;
85-
stream.count = InstData.data[InstanceIndex].back_genchoice_count;
86-
}
87-
return stream;
88-
}
89-
instr_stream_t getTexPrefetchStream(in MC_precomputed_t precomp)
90-
{
91-
instr_stream_t stream;
92-
if (precomp.frontface)
93-
{
94-
stream.offset = InstData.data[InstanceIndex].front_prefetch_offset;
95-
stream.count = InstData.data[InstanceIndex].front_prefetch_count;
96-
}
97-
else
98-
{
99-
stream.offset = InstData.data[InstanceIndex].back_prefetch_offset;
100-
stream.count = InstData.data[InstanceIndex].back_prefetch_count;
101-
}
102-
return stream;
103-
}
104-
instr_stream_t getNormalPrecompStream(in MC_precomputed_t precomp)
105-
{
106-
instr_stream_t stream;
107-
if (precomp.frontface)
108-
{
109-
stream.offset = InstData.data[InstanceIndex].front_instr_offset + InstData.data[InstanceIndex].front_rem_pdf_count + InstData.data[InstanceIndex].front_genchoice_count;
110-
stream.count = InstData.data[InstanceIndex].front_nprecomp_count;
111-
}
112-
else
113-
{
114-
stream.offset = InstData.data[InstanceIndex].back_instr_offset + InstData.data[InstanceIndex].back_rem_pdf_count + InstData.data[InstanceIndex].back_genchoice_count;
115-
stream.count = InstData.data[InstanceIndex].back_nprecomp_count;
116-
}
117-
return stream;
48+
return dPosdScreen;
11849
}
119-
#include <irr/builtin/material_compiler/glsl/common.glsl>
120-
*/
50+
#define _NBL_USER_PROVIDED_MATERIAL_COMPILER_GLSL_BACKEND_FUNCTIONS_
51+
#include <nbl/builtin/glsl/material_compiler/common.glsl>
12152

12253
//
12354
///
@@ -277,12 +208,22 @@ void main()
277208

278209
bool alive = false;
279210
nbl_glsl_MC_precomputed_t precomputed;
211+
nbl_glsl_MC_oriented_material_t material;
280212
nbl_glsl_xoroshiro64star_state_t start_scramble;
281213
vec2 uv;
282214
if (revdepth>0.0)
283215
{
284216
// vis buffer read
285217
const uvec2 visBuffer = texelFetch(frontFacing_Object_Triangle,pixelCoord,0).rg;
218+
mat2x3 dBarydScreen;/*
219+
{
220+
// TODO: future https://diaryofagraphicsprogrammer.blogspot.com/2018/03/triangle-visibility-buffer.html
221+
vec4 data;// = texelFetch(barycentricDerivatives,pixelCoord,0);
222+
dBarydScreen[0] = vec3(data.rg,-data.r-data.g);
223+
dBarydScreen[1] = vec3(data.ba,-data.b-data.a);
224+
}
225+
dPosdScreen = mat3(vPos[0],vPos[1],vPos[2])*dBarydScreen;
226+
*/
286227
// init scramble
287228
start_scramble = texelFetch(scramblebuf,pixelCoord,0).rg;
288229
// tmp gbuffer reads
@@ -312,11 +253,12 @@ void main()
312253
normalizedN = nbl_glsl_NormalDecode_signedSpherical(normalBuffer);
313254
}
314255

315-
// TODO: once we merge the material compiler with the raygen
316-
//precomputed = precomputeData(frontfacing);
256+
//
257+
precomputed = nbl_glsl_MC_precomputeData(frontfacing);
258+
//material = nbl_glsl_MC_material_data_t_getOriented(InstData.data[objectID].material,precomputed.frontface);
317259

318260
//
319-
const vec3 emissive = vec3(0.0,1.0,0.0);
261+
const vec3 emissive = vec3(0.0,1.0,0.0);//nbl_glsl_MC_oriented_material_t_getEmissive(material);
320262
vec3 acc;
321263
if (pc.cummon.rcpFramesDispatched<1.0)
322264
acc = fetchAccumulation(pixelCoord)+emissive/float(pc.cummon.framesDispatched-1u);
@@ -351,8 +293,8 @@ void main()
351293
{
352294
throughput /= float(staticViewData.samplesPerPixelPerDispatch);
353295

354-
rays[realOutputID].origin = nbl_glsl_MC_WorldSpacePosition();/*+newray.direction*err?; TODO */
355-
rays[realOutputID].maxT = 0.0;
296+
rays[realOutputID].origin = nbl_glsl_MC_getWorldSpacePosition();/*+newray.direction*err?; TODO */
297+
rays[realOutputID].maxT = FLT_MAX;
356298
rays[realOutputID].direction = direction;
357299
rays[realOutputID].mask = -1;
358300
rays[realOutputID]._active = 1;

0 commit comments

Comments
 (0)