Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hlsl bxdfs #797

Closed
wants to merge 230 commits into from
Closed
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
230 commits
Select commit Hold shift + click to select a range
4a1c47a
Implemented emulated float64 type
Przemog1 May 13, 2024
a5a1a70
Merge branch 'master' of https://github.com/Devsh-Graphics-Programmin…
Przemog1 May 15, 2024
76ec495
Updated examples
Przemog1 May 15, 2024
e397402
Updated examples
Przemog1 May 15, 2024
1f0a8eb
Modified emulated float file
Przemog1 May 15, 2024
338213c
Fixed GPU values test
Przemog1 May 16, 2024
9c2dc77
SavingWork
Przemog1 May 23, 2024
9043b29
Impliminted primitive multiplication for emulated_float64_t
Przemog1 May 27, 2024
b20de53
Implemented add sub i mul operators
Przemog1 May 31, 2024
c5a6352
All operators (except div) works on both CPU and GPU
Przemog1 Jun 5, 2024
9de77db
Ported ieee754.glsl
Przemog1 Jun 10, 2024
aba21ce
Implemented ieee754.hlsl
Przemog1 Jun 13, 2024
d54ac4d
Saving work
Przemog1 Jun 18, 2024
6addf2b
Resolved conflicts, merged master
Przemog1 Jun 18, 2024
4a937b9
Saving work
Przemog1 Jun 21, 2024
669983f
Improvements
Przemog1 Jul 8, 2024
afef3ec
Updated example
Przemog1 Jul 9, 2024
c204d58
Resolved conflicts, merged master
Przemog1 Jul 9, 2024
10b8a30
Saving work
Przemog1 Jul 24, 2024
a0dfdb2
Fixes
Przemog1 Jul 30, 2024
a382ee5
Refactorization
Przemog1 Jul 31, 2024
7efdd14
Resolved conflicts, merged master
Przemog1 Jul 31, 2024
1e419da
Fixes
Przemog1 Aug 1, 2024
2b7ba9b
Correction
Przemog1 Aug 1, 2024
f6c6e59
Saving work
Przemog1 Aug 6, 2024
98f4784
Resolved conflicts, merged master
Przemog1 Aug 6, 2024
b816d68
Updated examples
Przemog1 Aug 6, 2024
9cc10c3
Saving work
Przemog1 Aug 7, 2024
48b133c
Saving work
Przemog1 Aug 13, 2024
5ce988f
update DXC submodule
AnastaZIuk Aug 13, 2024
6b0bb28
No Float64 cap
Przemog1 Aug 20, 2024
e57177b
Merge branch 'emulated_float64_t' of github.com:Devsh-Graphics-Progra…
Przemog1 Aug 20, 2024
7af8d63
Fixes
Przemog1 Aug 20, 2024
bc379a7
Refactor
Przemog1 Aug 22, 2024
424d3a8
Saving work
Przemog1 Aug 23, 2024
d62c7db
Resolved conflicts, merged master
Przemog1 Aug 23, 2024
a1d68d0
Resolved conflicts, merged master
Przemog1 Aug 23, 2024
26d5c83
Merge branch 'emulated_float64_t' of github.com:Devsh-Graphics-Progra…
Przemog1 Aug 23, 2024
2e9a255
Saving work
Przemog1 Aug 23, 2024
fa3636a
add missing if statement for device gen builtins (top level cmake bui…
AnastaZIuk Aug 24, 2024
a265dba
Saving work
Przemog1 Aug 24, 2024
b0a3019
Merge branch 'master' of github.com:Devsh-Graphics-Programming/Nabla …
Przemog1 Aug 24, 2024
96d3281
Implemented casting functions for emulated_float64_t
Przemog1 Aug 26, 2024
ae5118d
Merge branch 'emulated_float64_t' of github.com:Devsh-Graphics-Progra…
Przemog1 Aug 26, 2024
916ba16
Removed unnecessary branches from add operator
Przemog1 Aug 27, 2024
aff0ca4
Revert unintended changes
Przemog1 Aug 27, 2024
ede8b0c
Fixes
Przemog1 Aug 28, 2024
002581a
Fixed shaders so they compile even if portable_float64_t is not emulated
Przemog1 Aug 28, 2024
9b8e61e
Saving work
Przemog1 Aug 28, 2024
a2cd395
Found the bug
Przemog1 Aug 30, 2024
6203ea6
Fixed a bug
Przemog1 Sep 3, 2024
1c029c1
Reduced branches in operator+
Przemog1 Sep 3, 2024
c9f7e47
Enhanced more tests, more fixes
Przemog1 Sep 6, 2024
fbfc7c2
Updated examples
Przemog1 Sep 6, 2024
2743cb9
64 bit float type is now determined by device capabilities
Przemog1 Sep 13, 2024
826d39b
Refactor
Przemog1 Sep 13, 2024
fb0ebd3
More refactor
Przemog1 Sep 13, 2024
52993c4
Saving work
Przemog1 Sep 14, 2024
aa444c4
Update CMakeLists.txt, change file names (vector_t.hlsl & matrix_t.hl…
AnastaZIuk Sep 16, 2024
29d07fb
Fixes
Przemog1 Sep 21, 2024
734b8eb
More fixes
Przemog1 Sep 23, 2024
ab95289
Even more fixes
Przemog1 Sep 25, 2024
71f4a8b
Saving work
Przemog1 Sep 27, 2024
ee12898
Modified add operator
Przemog1 Sep 28, 2024
0cb210d
Updated examples
Przemog1 Sep 28, 2024
8095e05
Updated examples
Przemog1 Sep 28, 2024
1f0cab5
Merged master
Przemog1 Sep 28, 2024
9e86de2
Added ef64_benchmark
Przemog1 Sep 28, 2024
7e3fea0
Saving work
Przemog1 Sep 30, 2024
a73b60e
Tests works
Przemog1 Oct 1, 2024
4eb1c05
Saving work
Przemog1 Oct 2, 2024
75d6d94
Benchmark works
Przemog1 Oct 4, 2024
39b8bd2
Saving work
Przemog1 Oct 4, 2024
3895211
Improved benchmark
Przemog1 Oct 5, 2024
f3afeb4
Updated benchmark example
Przemog1 Oct 7, 2024
ab86fdf
Fixed substraction
Przemog1 Oct 7, 2024
ff5c747
Updated examples
Przemog1 Oct 8, 2024
f11d61e
Updated examples
Przemog1 Oct 9, 2024
bce0dac
Resolved conflicts, merged emulated_float64_t
Przemog1 Oct 9, 2024
eecbbaa
Updated examples
Przemog1 Oct 9, 2024
684bcc2
Updated examples
Przemog1 Oct 10, 2024
324102b
Merge pull request #750 from Devsh-Graphics-Programming/ef64_benchmark
Przemog1 Oct 10, 2024
6236fdd
Fixed ef64 with fast math enabled
Przemog1 Oct 10, 2024
8caa917
Fixed array_get and array_set
Przemog1 Oct 15, 2024
da30fcd
Resolved conflicts, merged master
Przemog1 Oct 21, 2024
847dc08
update examples
Erfan-Ahmadi Oct 25, 2024
23843c8
Merge branch 'master' into emulated_float64_t
Erfan-Ahmadi Oct 25, 2024
f5581e3
Resolved conflicts, merged master
Przemog1 Nov 4, 2024
569cea2
Resolved conflicts, merged master
Przemog1 Nov 19, 2024
34ee35c
some test bxdfs using concepts and templates
keptsecret Nov 25, 2024
f6752c6
some corrections
keptsecret Nov 25, 2024
42fcb2a
anisotropic concept
keptsecret Nov 26, 2024
81e56f4
concepts for existing stuff
keptsecret Nov 26, 2024
8417652
Implemented nbl::hlsl::mul
Przemog1 Nov 26, 2024
4359f91
Fixed array_get and array_set
Przemog1 Nov 26, 2024
1e73953
more templated stuff, new type trait dimensions
keptsecret Nov 27, 2024
6253da8
template conditionalabs
keptsecret Nov 27, 2024
adb4262
Cherry picked matrix_traits.hlsl
Przemog1 Nov 28, 2024
d13cad4
completed adapting functions?
keptsecret Nov 28, 2024
7110c50
added bxdf concept
keptsecret Nov 28, 2024
6bcbe56
Extended nbl::hlsl::dot function so it can be used with emulated_vect…
Przemog1 Nov 28, 2024
98a0be1
fresnel function templates
keptsecret Nov 29, 2024
eef66c6
lambertian, oren nayar brdf
keptsecret Nov 29, 2024
25ede82
Saving work
Przemog1 Dec 1, 2024
3817408
Updated cmake lists
Przemog1 Dec 1, 2024
eec8486
removed dimensions, extended rank/extent to vectors/matrix
keptsecret Dec 2, 2024
fcadc22
impl geom_smith and ndf funcs
keptsecret Dec 2, 2024
9742aa1
more bxdfs, fix concepts
keptsecret Dec 3, 2024
8433133
restructure existing bxdfs
keptsecret Dec 4, 2024
8e94bcc
Refactor
Przemog1 Dec 4, 2024
bafe623
ggx brdf
keptsecret Dec 5, 2024
3ad9f44
some bsdfs
keptsecret Dec 5, 2024
659f94e
Now every operation on emulated_float64_t flushes denorms to 0
Przemog1 Dec 5, 2024
373a013
Added glsl::findMSB
Przemog1 Dec 5, 2024
bc13d1f
beckmann bsdf, bug fixes
keptsecret Dec 6, 2024
600cac8
Saving work
Przemog1 Dec 6, 2024
971f28e
Resolved conflicts, merged master
Przemog1 Dec 6, 2024
30a8c96
Improvements
Przemog1 Dec 7, 2024
f56476e
typedefs in concepts
keptsecret Dec 9, 2024
fe7c882
ndfs as structs()
keptsecret Dec 9, 2024
4abf68c
Refactor
Przemog1 Dec 9, 2024
52dc613
Fix
Przemog1 Dec 9, 2024
9d00340
Merge branch 'master' of https://github.com/Devsh-Graphics-Programmin…
Przemog1 Dec 9, 2024
a12d8d1
redid microfacet_to_light_transform as all structs
keptsecret Dec 10, 2024
328c7ea
fixed missing type
keptsecret Dec 10, 2024
aeafa07
changed geom smith to templated structs
keptsecret Dec 10, 2024
d42d7e1
Saving work
Przemog1 Dec 10, 2024
91ca79e
adjusted BxDF concept, new impl BxDF structs
keptsecret Dec 11, 2024
3401783
refactored brdfs
keptsecret Dec 11, 2024
3115423
corrected concept macro usage
keptsecret Dec 11, 2024
b244c12
finished beckmann+ggx bsdfs, fixed typos
keptsecret Dec 12, 2024
39f5c4b
Resolved conflicts, merged cpp_compat_intrinsics_refactor
Przemog1 Dec 12, 2024
f278259
Resolved conflicts, merged cpp_compat_intrinsics_refactor
Przemog1 Dec 12, 2024
22ab085
Fixes
Przemog1 Dec 12, 2024
e8d5aa3
changes for cpp compat
keptsecret Dec 13, 2024
8158aea
Merge branch 'master' into hlsl_bxdfs
keptsecret Dec 13, 2024
475c65a
Saving work
Przemog1 Dec 13, 2024
d632b3a
moved math functions to tgmath
keptsecret Dec 16, 2024
9cac1c9
moved math changes over
keptsecret Dec 16, 2024
8de3ce4
rsqrt not from stl
keptsecret Dec 16, 2024
3df4851
Merge branch 'master' into hlsl_bxdfs
keptsecret Dec 16, 2024
ffaaf87
rsqrt not in stl
keptsecret Dec 16, 2024
aa0748e
fix example conflict
keptsecret Dec 16, 2024
b33aaed
moved math funcs to tgmath
keptsecret Dec 16, 2024
dda71b8
some needed math funcs
keptsecret Dec 16, 2024
aae9a58
update to pr801/803 #1
keptsecret Dec 16, 2024
c3c97e1
funcs use with c++
keptsecret Dec 16, 2024
0b46b67
some more math funcs
keptsecret Dec 16, 2024
b308bff
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Dec 16, 2024
2c2b368
hlsl bxdf test example init
keptsecret Dec 17, 2024
67993ad
fixed include
keptsecret Dec 17, 2024
acadc15
Merge remote-tracking branch 'origin/cpp_compat_intrinsics_refactor' …
keptsecret Dec 17, 2024
a5d48de
fixed cpp compat types
keptsecret Dec 17, 2024
35cd97a
merge fixes from branch
keptsecret Dec 17, 2024
4f230e8
use correct examples
keptsecret Dec 17, 2024
029116f
fixed cpp compat types
keptsecret Dec 17, 2024
aa91c06
some bug fixes
keptsecret Dec 17, 2024
af6f0d6
Resolved conflicts, merged cpp_compat_intrinsics_refactor
Przemog1 Dec 17, 2024
6abc6ce
Merge branch 'cpp_compat_intrinsics_refactor' of https://github.com/D…
Przemog1 Dec 17, 2024
20bff2c
Merge branch 'cpp_compat_intrinsics_refactor' of https://github.com/D…
Przemog1 Dec 17, 2024
03c9042
Created transpose partial spec for emulated matrices
Przemog1 Dec 17, 2024
362d8cd
more bug,typo fixes
keptsecret Dec 18, 2024
279774c
Intrinsics.hlsl refactor
Przemog1 Dec 18, 2024
0064f57
Added ieee754.hlsl and improved intrinsics.hlsl
Przemog1 Dec 18, 2024
7734550
fixed bsdf bugs
keptsecret Dec 19, 2024
89f37f8
Merge branch 'master' into maths_for_bxdfs_hlsl
keptsecret Dec 19, 2024
28427b5
some cpp compat fixes
keptsecret Dec 19, 2024
05ef0e8
merge math fixes and latest example
keptsecret Dec 19, 2024
36ecbe3
Fixed emulated_float64_t bug
Przemog1 Dec 19, 2024
b2c0537
Refactor
Przemog1 Dec 19, 2024
30aafb3
Fixed substraction of two inf values
Przemog1 Dec 19, 2024
e77d628
Merge branch 'master' of https://github.com/Devsh-Graphics-Programmin…
Przemog1 Dec 19, 2024
f726750
Updated examples
Przemog1 Dec 19, 2024
8e957ce
Merge branch 'master' of https://github.com/Devsh-Graphics-Programmin…
Przemog1 Dec 19, 2024
86cabe4
Improved mul function
Przemog1 Dec 19, 2024
0770eb9
isinf and isnan workaround
Przemog1 Dec 19, 2024
6690cf8
Merge branch 'master' into maths_for_bxdfs_hlsl
keptsecret Dec 20, 2024
a517d22
review changes
keptsecret Dec 20, 2024
0abf434
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Dec 20, 2024
2aa51eb
use bit_cast instead of reinterpret_cast
keptsecret Dec 20, 2024
b53c605
fix concepts
keptsecret Dec 20, 2024
911d8fc
use templated glm methods
keptsecret Dec 20, 2024
16209a8
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Dec 20, 2024
5a3e7e6
fix aniso inter create
keptsecret Dec 20, 2024
14e1010
reverted changes, use glm
keptsecret Dec 20, 2024
cbdb9f6
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Dec 20, 2024
fb7b643
Updated examples
Przemog1 Dec 20, 2024
845707c
Added tgmath.hlsl
Przemog1 Dec 20, 2024
3f1db30
Moved some functions to tgmath.hlsl
Przemog1 Dec 20, 2024
f0c217f
Resolved conflicts, merged cpp_intrinsics_improvements
Przemog1 Dec 20, 2024
7e1edae
Updated examples
Przemog1 Dec 20, 2024
5fd3934
Added constraints to the `floor` function
Przemog1 Dec 20, 2024
2f38f2a
Refactor
Przemog1 Dec 20, 2024
7e73054
Refactored the `floor` function
Przemog1 Dec 21, 2024
0276f8e
`Floor` func improvement
Przemog1 Dec 21, 2024
4d0d477
Resolved conflicts, merged master
Przemog1 Dec 21, 2024
c1c6b04
cmake: add missing builtin header
alichraghi Dec 21, 2024
f933b2a
Merge pull request #807 from Devsh-Graphics-Programming/ali_cmake_fix
devshgraphicsprogramming Dec 21, 2024
147c080
Added negate and copy sign functions
Przemog1 Dec 21, 2024
a640976
Moved flipSign function to ieee754.hlsl
Przemog1 Dec 21, 2024
c544d05
update submodule pointer
Dec 22, 2024
785291d
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Dec 23, 2024
1286459
fixed all? bugs
keptsecret Dec 23, 2024
70f2870
Fixed bitcount, added normalize
Przemog1 Dec 23, 2024
9dc8b43
Refactored `hlsl::cross` function
Przemog1 Dec 23, 2024
677b176
Refactor
Przemog1 Dec 23, 2024
949a972
fix
Przemog1 Dec 23, 2024
3616dcf
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Dec 24, 2024
3b78a06
more bug fixes
keptsecret Dec 25, 2024
5bfdf2f
lots more typo fixes
keptsecret Dec 25, 2024
ecdbbf7
final? bxdf concept, bug fixes
keptsecret Dec 26, 2024
04f60ab
fix refract functions
keptsecret Dec 26, 2024
c4fd4bb
removed dot_product.hlsl from cmake and added intrinsics_impl.hlsl
Erfan-Ahmadi Dec 28, 2024
58ad120
update examples_tests
Erfan-Ahmadi Dec 28, 2024
b9ae9f8
removed FORCE_EMULATED_FLOAT64
Erfan-Ahmadi Dec 28, 2024
b925bde
update examples_tests
Erfan-Ahmadi Dec 28, 2024
099693e
Merge branch 'emulated_float64_t'
Erfan-Ahmadi Dec 28, 2024
6fecfa9
Now every tgmath function utilize helpers
Przemog1 Dec 28, 2024
abf6ed7
Merge branch 'maths_for_bxdfs_hlsl' of https://github.com/Devsh-Graph…
Przemog1 Dec 28, 2024
0d5ede1
Resolved conflicts, merged master
Przemog1 Dec 28, 2024
19c30e5
Fixed NBL_IMPL_CONCEPT_REQ_EXPR_RET_TYPE
Przemog1 Dec 30, 2024
2e56fc9
Added Vector and Matrix concepts
Przemog1 Dec 30, 2024
f99ad10
Added `all` and `any`
Przemog1 Dec 30, 2024
ca8905e
update examples merge conflict
keptsecret Jan 3, 2025
9d2a2f3
bug fixes
keptsecret Jan 3, 2025
9a8842d
fix cmakelist duplicate entry, float literal
keptsecret Jan 3, 2025
b83fae6
Merge branch 'maths_for_bxdfs_hlsl' into hlsl_bxdfs
keptsecret Jan 3, 2025
2539b13
use simpler getcolumn method
keptsecret Jan 3, 2025
796c65b
more brdf bug fixes and example update
keptsecret Jan 6, 2025
9ad1be4
bug fixes, microfacet_transform needs rechecking
keptsecret Jan 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,282 changes: 938 additions & 344 deletions include/nbl/builtin/hlsl/bxdf/common.hlsl

Large diffs are not rendered by default.

293 changes: 293 additions & 0 deletions include/nbl/builtin/hlsl/bxdf/geom_smith.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
// Copyright (C) 2018-2023 - DevSH Graphics Programming Sp. z O.O.
// This file is part of the "Nabla Engine".
// For conditions of distribution and use, see copyright notice in nabla.h
#ifndef _NBL_BUILTIN_HLSL_BXDF_GEOM_INCLUDED_
#define _NBL_BUILTIN_HLSL_BXDF_GEOM_INCLUDED_

#include "nbl/builtin/hlsl/bxdf/ndf.hlsl"

namespace nbl
{
namespace hlsl
{
namespace bxdf
{
namespace smith
{


template<typename T NBL_FUNC_REQUIRES(is_scalar_v<T>)
T G1(T lambda)
{
return 1.0 / (1.0 + lambda);
}

template<typename NDF>
T VNDF_pdf_wo_clamps(NDF ndf, typename NDF::scalar_type lambda_V, typename NDF::scalar_type maxNdotV, out typename NDF::scalar_type onePlusLambda_V)
{
onePlusLambda_V = 1.0 + lambda_V;
ndf::microfacet_to_light_measure_transform<NDF,ndf::REFLECT_BIT> transform = ndf::microfacet_to_light_measure_transform<NDF,ndf::REFLECT_BIT>::create(ndf() / onePlusLambda_V, maxNdotV);
return transform();
}

template<typename NDF>
T VNDF_pdf_wo_clamps(NDF ndf, typename NDF::scalar_type lambda_V, typename NDF::scalar_type absNdotV, bool transmitted, typename NDF::scalar_type VdotH, typename NDF::scalar_type LdotH, typename NDF::scalar_type VdotHLdotH, typename NDF::scalar_type orientedEta, typename NDF::scalar_type reflectance, out typename NDF::scalar_type onePlusLambda_V)
{
onePlusLambda_V = 1.0 + lambda_V;
ndf::microfacet_to_light_measure_transform<NDF,ndf::REFLECT_REFRACT_BIT> transform
= ndf::microfacet_to_light_measure_transform<NDF,ndf::REFLECT_REFRACT_BIT>::create((transmitted ? (1.0 - reflectance) : reflectance) * ndf() / onePlusLambda_V, , absNdotV, transmitted, VdotH, LdotH, VdotHLdotH, orientedEta);
return transform();
}

template<typename T NBL_FUNC_REQUIRES(is_scalar_v<T>)
T VNDF_pdf_wo_clamps(T ndf, T G1_over_2NdotV)
{
return ndf * 0.5 * G1_over_2NdotV;
}

template<typename T NBL_FUNC_REQUIRES(is_scalar_v<T>)
T FVNDF_pdf_wo_clamps(T fresnel_ndf, T G1_over_2NdotV, T absNdotV, bool transmitted, T VdotH, T LdotH, T VdotHLdotH, T orientedEta)
{
T FNG = fresnel_ndf * G1_over_2NdotV;
T factor = 0.5;
if (transmitted)
{
const T VdotH_etaLdotH = (VdotH + orientedEta * LdotH);
// VdotHLdotH is negative under transmission, so this factor is negative
factor *= -2.0 * VdotHLdotH / (VdotH_etaLdotH * VdotH_etaLdotH);
}
return FNG * factor;
}

template<typename T NBL_FUNC_REQUIRES(is_scalar_v<T>)
T VNDF_pdf_wo_clamps(T ndf, T G1_over_2NdotV, T absNdotV, bool transmitted, T VdotH, T LdotH, T VdotHLdotH, T orientedEta, T reflectance)
{
T FN = (transmitted ? (1.0 - reflectance) : reflectance) * ndf;
return FVNDF_pdf_wo_clamps<T>(FN, G1_over_2NdotV, absNdotV, transmitted, VdotH, LdotH, VdotHLdotH, orientedEta);
}


template<typename T NBL_PRIMARY_REQUIRES(is_scalar_v<T>)
struct SIsotropicParams
{
using this_t = SIsotropicParams<T>;

static this_t create(T a2, T NdotV2, T NdotL2, T lambdaV_plus_one) // beckmann
{
this_t retval;
retval.a2 = a2;
retval.NdotV2 = NdotV2;
retval.NdotL2 = NdotL2;
retval.lambdaV_plus_one = lambdaV_plus_one;
return this_t;
}

static this_t create(T a2, T NdotV, T NdotV2, T NdotL, T NdotL2) // ggx
{
this_t retval;
retval.a2 = a2;
retval.NdotV = NdotV;
retval.NdotV2 = NdotV2;
retval.NdotL = NdotL;
retval.NdotL2 = NdotL2;
retval.one_minus_a2 = 1.0 - a2;
return this_t;
}

T a2;
T NdotV;
T NdotL;
T NdotV2;
T NdotL2;
T lambdaV_plus_one;
T one_minus_a2;
};

template<typename T NBL_PRIMARY_REQUIRES(is_scalar_v<T>)
struct SAnisotropicParams
{
using this_t = SAnisotropicParams<T>;

static this_t create(T ax2, T ay2, T TdotV2, T BdotV2, T NdotV2, T TdotL2, T BdotL2, T NdotL2, T lambdaV_plus_one) // beckmann
{
this_t retval;
retval.ax2 = ax2;
retval.ay2 = ay2;
retval.TdotV2 = TdotV2;
retval.BdotV2 = BdotV2;
retval.NdotV2 = NdotV2;
retval.TdotL2 = TdotL2;
retval.BdotL2 = BdotL2;
retval.NdotL2 = NdotL2;
retval.lambdaV_plus_one = lambdaV_plus_one;
return this_t;
}

static this_t create(T ax2, T ay2, T NdotV, T TdotV2, T BdotV2, T NdotV2, T NdotL, T TdotL2, T BdotL2, T NdotL2) // ggx
{
this_t retval;
retval.ax2 = ax2;
retval.ay2 = ay2;
retval.NdotL = NdotL;
retval.NdotV = NdotV;
retval.TdotV2 = TdotV2;
retval.BdotV2 = BdotV2;
retval.NdotV2 = NdotV2;
retval.TdotL2 = TdotL2;
retval.BdotL2 = BdotL2;
retval.NdotL2 = NdotL2;
return this_t;
}

T ax2;
T ay2;
T NdotV;
T NdotL;
T TdotV2;
T BdotV2;
T NdotV2;
T TdotL2;
T BdotL2;
T NdotL2;
T lambdaV_plus_one;
};


// beckmann
template<typename T NBL_PRIMARY_REQUIRES(is_scalar_v<T>)
struct Beckmann
{
using scalar_type = T;

scalar_type C2(scalar_type NdotX2, scalar_type a2)
{
return NdotX2 / (a2 * (1.0 - NdotX2));
}

scalar_type C2(scalar_type TdotX2, scalar_type BdotX2, scalar_type NdotX2, scalar_type ax2, scalar_type ay2)
{
return NdotX2 / (TdotX2 * ax2 + BdotX2 * ay2);
}

scalar_type Lambda(scalar_type c2)
{
scalar_type c = sqrt(c2);
scalar_type nom = 1.0 - 1.259 * c + 0.396 * c2;
scalar_type denom = 2.181 * c2 + 3.535 * c;
return lerp(0.0, nom / denom, c < 1.6);
}

scalar_type Lambda(scalar_type NdotX2, scalar_type a2)
{
return Lambda(C2(NdotX2, a2));
}

scalar_type Lambda(scalar_type TdotX2, scalar_type BdotX2, scalar_type NdotX2, scalar_type ax2, scalar_type ay2)
{
return Lambda(C2(TdotX2, BdotX2, NdotX2, ax2, ay2));
}

scalar_type smith_correlated(SIsotropicParams<scalar_type> params)
{
scalar_type c2 = C2(params.NdotV2, params.a2);
scalar_type L_v = Lambda(c2);
c2 = C2(params.NdotL2, params.a2);
scalar_type L_l = Lambda(c2);
return G1<scalar_type>(L_v + L_l);
}

scalar_type smith_correlated(SAnisotropicParams<scalar_type> params)
{
scalar_type c2 = C2(params.TdotV2, params.BdotV2, params.NdotV2, params.ax2, params.ay2);
scalar_type L_v = Lambda(c2);
c2 = C2(params.TdotL2, params.BdotL2, params.NdotL2, params.ax2, params.ay2);
scalar_type L_l = Lambda(c2);
return G1<scalar_type>(L_v + L_l);
}

scalar_type smith_G2_over_G1(SIsotropicParams<scalar_type> params)
{
scalar_type lambdaL = Lambda(params.NdotL2, params.a2);
return params.lambdaV_plus_one / (params.lambdaV_plus_one + lambdaL);
}

scalar_type smith_G2_over_G1(SAnisotropicParams<scalar_type> params)
{
scalar_type c2 = C2(params.TdotL2, params.BdotL2, params.NdotL2, params.ax2, params.ay2);
scalar_type lambdaL = Lambda(c2);
return params.lambdaV_plus_one / (params.lambdaV_plus_one + lambdaL);
}
};


// ggx
template<typename T NBL_PRIMARY_REQUIRES(is_scalar_v<T>)
struct GGX
{
using scalar_type = T;

scalar_type devsh_part(scalar_type NdotX2, scalar_type a2, scalar_type one_minus_a2)
{
return sqrt(a2 + one_minus_a2 * NdotX2);
}

scalar_type devsh_part(scalar_type TdotX2, scalar_type BdotX2, scalar_type NdotX2, scalar_type ax2, scalar_type ay2)
{
return sqrt(TdotX2 * ax2 + BdotX2 * ay2 + NdotX2);
}

scalar_type G1_wo_numerator(scalar_type NdotX, scalar_type NdotX2, scalar_type a2, scalar_type one_minus_a2)
{
return 1.0 / (NdotX + ggx_devsh_part<T>(NdotX2,a2,one_minus_a2));
}

scalar_type G1_wo_numerator(scalar_type NdotX, scalar_type TdotX2, scalar_type BdotX2, scalar_type NdotX2, scalar_type ax2, scalar_type ay2)
{
return 1.0 / (NdotX + ggx_devsh_part<T>(TdotX2, BdotX2, NdotX2, ax2, ay2));
}

scalar_type G1_wo_numerator(scalar_type NdotX, scalar_type devsh_part)
{
return 1.0 / (NdotX + devsh_part);
}

scalar_type correlated_wo_numerator(SIsotropicParams<scalar_type> params)
{
scalar_type Vterm = params.NdotL * devsh_part(params.NdotV2, params.a2, params.one_minus_a2);
scalar_type Lterm = params.NdotV * devsh_part(params.NdotL2, params.a2, params.one_minus_a2);
return 0.5 / (Vterm + Lterm);
}

scalar_type correlated_wo_numerator(SAnisotropicParams<scalar_type> params)
{
scalar_type Vterm = params.NdotL * devsh_part(params.TdotV2, params.BdotV2, params.NdotV2, params.ax2, params.ay2);
scalar_type Lterm = params.NdotV * devsh_part(params.TdotL2, params.BdotL2, params.NdotL2, params.ax2, params.ay2);
return 0.5 / (Vterm + Lterm);
}

scalar_type G2_over_G1(SIsotropicParams<scalar_type> params)
{
scalar_type devsh_v = devsh_part(params.NdotV2, params.a2, params.one_minus_a2);
scalar_type G2_over_G1 = params.NdotL * (devsh_v + params.NdotV); // alternative `Vterm+NdotL*NdotV /// NdotL*NdotV could come as a parameter
G2_over_G1 /= params.NdotV * devsh_part(params.NdotL2, params.a2, params.one_minus_a2) + params.NdotL * devsh_v;

return G2_over_G1;
}

scalar_type G2_over_G1(SAnisotropicParams<scalar_type> params)
{
scalar_type devsh_v = devsh_part(params.TdotV2, params.BdotV2, params.NdotV2, params.ax2, params.ay2);
scalar_type G2_over_G1 = params.NdotL * (devsh_v + params.NdotV);
G2_over_G1 /= params.NdotV * devsh_part(params.TdotL2, params.BdotL2, params.NdotL2, params.ax2, params.ay2) + params.NdotL * devsh_v;

return G2_over_G1;
}

};

}
}
}
}

#endif
Loading