Skip to content

Commit 0dabfde

Browse files
committed
nbl_glsl_ compute interaction functions iwth user-provided pos derivatives
1 parent 82ef7b9 commit 0dabfde

File tree

4 files changed

+27
-11
lines changed

4 files changed

+27
-11
lines changed

examples_tests/22.RaytracedAO/raygen.comp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ layout(set = 2, binding = 4) uniform sampler2D encodedNormal;
1414
layout(set = 2, binding = 5) uniform sampler2D uvCoords;
1515

1616

17-
// for materials
18-
// dummies needed because of the functions for fragment shader surface intersections
19-
vec3 dFdx(in vec3 r) {return vec3(0.0/0.0);}
20-
vec3 dFdy(in vec3 r) {return vec3(0.0/0.0);}
2117
// no idea yet
2218
#define sizeof_bsdf_data 1u // wtf??? it's not supposed to be user-defined
2319
#include <nbl/builtin/glsl/material_compiler/common_declarations.glsl>
@@ -32,10 +28,14 @@ vec3 nbl_glsl_MC_getNormalizedWorldSpaceN()
3228
return normalizedN;
3329
}
3430
vec3 worldPosition;
35-
vec3 nbl_glsl_MC_WorldSpacePosition()
31+
vec3 nbl_glsl_MC_getWorldSpacePosition()
3632
{
3733
return worldPosition;
3834
}
35+
mat2x3 nbl_glsl_MC_getdPos(in vec3 p)
36+
{
37+
return mat2x3(vec3(0.0/0.0), vec3(0.0/0.0));
38+
}
3939
/*
4040
#define _IRR_USER_PROVIDED_MATERIAL_COMPILER_GLSL_BACKEND_FUNCTIONS_
4141
instr_stream_t getEvalStream(in MC_precomputed_t precomp)

include/nbl/builtin/glsl/bxdf/common.glsl

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,12 @@ mat2x4 nbl_glsl_applyScreenSpaceChainRule4D3(in mat3x4 dFdG, in mat2x3 dGdScreen
134134
return dFdG*dGdScreen;
135135
}
136136

137-
// only in the fragment shader we have access to implicit derivatives
138-
nbl_glsl_IsotropicViewSurfaceInteraction nbl_glsl_calcFragmentShaderSurfaceInteractionFromViewVector(in vec3 _View, in vec3 _SurfacePos, in vec3 _Normal)
137+
nbl_glsl_IsotropicViewSurfaceInteraction nbl_glsl_calcSurfaceInteractionFromViewVector(in vec3 _View, in vec3 _SurfacePos, in vec3 _Normal, in mat2x3 dpd_)
139138
{
140139
nbl_glsl_IsotropicViewSurfaceInteraction interaction;
141140
interaction.V.dir = _View;
142-
interaction.V.dPosdScreen[0] = dFdx(_SurfacePos);// TODO: require the user to feed us the derivatives
143-
interaction.V.dPosdScreen[1] = dFdy(_SurfacePos);
141+
interaction.V.dPosdScreen[0] = dpd_[0];
142+
interaction.V.dPosdScreen[1] = dpd_[1];
144143
interaction.N = _Normal;
145144
float invlenV2 = inversesqrt(dot(interaction.V.dir, interaction.V.dir));
146145
float invlenN2 = inversesqrt(dot(interaction.N, interaction.N));
@@ -150,6 +149,18 @@ nbl_glsl_IsotropicViewSurfaceInteraction nbl_glsl_calcFragmentShaderSurfaceInter
150149
interaction.NdotV_squared = interaction.NdotV * interaction.NdotV;
151150
return interaction;
152151
}
152+
nbl_glsl_IsotropicViewSurfaceInteraction nbl_glsl_calcSurfaceInteraction(in vec3 _CamPos, in vec3 _SurfacePos, in vec3 _Normal, in mat2x3 dpd_)
153+
{
154+
vec3 V = _CamPos - _SurfacePos;
155+
return nbl_glsl_calcSurfaceInteractionFromViewVector(V, _SurfacePos, _Normal, dpd_);
156+
}
157+
158+
// only in the fragment shader we have access to implicit derivatives
159+
nbl_glsl_IsotropicViewSurfaceInteraction nbl_glsl_calcFragmentShaderSurfaceInteractionFromViewVector(in vec3 _View, in vec3 _SurfacePos, in vec3 _Normal)
160+
{
161+
mat2x3 dpd = mat2x3(dFdx(_SurfacePos), dFdy(_SurfacePos));
162+
return nbl_glsl_calcSurfaceInteractionFromViewVector(_View, _SurfacePos, _Normal, dpd);
163+
}
153164
nbl_glsl_IsotropicViewSurfaceInteraction nbl_glsl_calcFragmentShaderSurfaceInteraction(in vec3 _CamPos, in vec3 _SurfacePos, in vec3 _Normal)
154165
{
155166
vec3 V = _CamPos - _SurfacePos;

include/nbl/builtin/glsl/material_compiler/common.glsl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <nbl/builtin/glsl/material_compiler/common_declarations.glsl>
55

66
#ifndef _NBL_USER_PROVIDED_MATERIAL_COMPILER_GLSL_BACKEND_FUNCTIONS_
7-
#error "You need to define 'vec3 nbl_glsl_MC_getNormalizedWorldSpaceV()', 'vec3 nbl_glsl_MC_getNormalizedWorldSpaceN()' , 'nbl_glsl_MC_getWorldSpacePosition()', 'nbl_glsl_instr_t nbl_glsl_MC_fetchInstr(in uint)', 'nbl_glsl_prefetch_instr_t nbl_glsl_MC_fetchPrefetchInstr(in uint)', 'nbl_glsl_bsdf_data_t nbl_glsl_MC_fetchBSDFData(in uint)' functions above"
7+
#error "You need to define 'vec3 nbl_glsl_MC_getNormalizedWorldSpaceV()', 'vec3 nbl_glsl_MC_getNormalizedWorldSpaceN()' , 'nbl_glsl_MC_getWorldSpacePosition()', 'nbl_glsl_instr_t nbl_glsl_MC_fetchInstr(in uint)', 'nbl_glsl_prefetch_instr_t nbl_glsl_MC_fetchPrefetchInstr(in uint)', 'nbl_glsl_bsdf_data_t nbl_glsl_MC_fetchBSDFData(in uint)', 'mat2x3 nbl_glsl_MC_getdPos(in vec3 p)' functions above"
88
#endif
99

1010
#include <nbl/builtin/glsl/math/functions.glsl>
@@ -341,7 +341,8 @@ mat2x4 nbl_glsl_instr_fetchSrcRegs(in nbl_glsl_instr_t i)
341341

342342
void nbl_glsl_setCurrInteraction(in vec3 N, in vec3 V, in vec3 pos)
343343
{
344-
nbl_glsl_IsotropicViewSurfaceInteraction interaction = nbl_glsl_calcFragmentShaderSurfaceInteractionFromViewVector(V, pos, N);
344+
mat2x3 dp = nbl_glsl_MC_getdPos(pos);
345+
nbl_glsl_IsotropicViewSurfaceInteraction interaction = nbl_glsl_calcSurfaceInteractionFromViewVector(V, pos, N, dp);
345346
currInteraction.inner = nbl_glsl_calcAnisotropicInteraction(interaction);
346347
nbl_glsl_finalizeInteraction(currInteraction);
347348
}

src/nbl/ext/MitsubaLoader/CMitsubaLoader.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ nbl_glsl_bsdf_data_t nbl_glsl_MC_fetchBSDFData(in uint ix)
180180
{
181181
return bsdf_buf.data[ix];
182182
}
183+
mat2x3 nbl_glsl_MC_getdPos(in vec3 p)
184+
{
185+
return mat2x3(dFdx(p), dFdy(p));
186+
}
183187
#define _NBL_USER_PROVIDED_MATERIAL_COMPILER_GLSL_BACKEND_FUNCTIONS_
184188
)";
185189
_NBL_STATIC_INLINE_CONSTEXPR const char* FRAGMENT_SHADER_IMPL = R"(

0 commit comments

Comments
 (0)