Skip to content

Commit 58e2a0b

Browse files
committed
fixes to cook torrance generate
1 parent 26c76e4 commit 58e2a0b

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

include/nbl/builtin/hlsl/bxdf/base/cook_torrance_base.hlsl

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,24 @@ struct SCookTorrance
165165
template<typename C=bool_constant<!IsBSDF> >
166166
enable_if_t<C::value && !IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(anisotropic_interaction_type) interaction, const vector2_type u, NBL_REF_ARG(anisocache_type) cache)
167167
{
168+
ray_dir_info_type localV_raydir = interaction.getV().transform(interaction.getToTangentSpace());
168169
const vector3_type localV = interaction.getTangentSpaceV();
169170
const vector3_type localH = ndf.generateH(localV, u);
170171

171172
cache = anisocache_type::createForReflection(localV, localH);
172-
ray_dir_info_type localL;
173+
// struct reflect_wrapper
174+
// {
175+
// vector3_type operator()()
176+
// {
177+
// return r(VdotH);
178+
// }
179+
// bxdf::Reflect<scalar_type> r;
180+
// scalar_type VdotH;
181+
// };
182+
// reflect_wrapper r;
173183
bxdf::Reflect<scalar_type> r = bxdf::Reflect<scalar_type>::create(localV, localH);
174-
localL = localL.reflect(r);
184+
// r.VdotH = cache.getVdotH();
185+
ray_dir_info_type localL = localV_raydir.reflect(r);
175186

176187
return sample_type::createFromTangentSpace(localL, interaction.getFromTangentSpace());
177188
}
@@ -180,33 +191,31 @@ struct SCookTorrance
180191
{
181192
fresnel::OrientedEtaRcps<monochrome_type> rcpEta = fresnel.getOrientedEtaRcps();
182193

194+
ray_dir_info_type V = interaction.getV();
183195
const vector3_type localV = interaction.getTangentSpaceV();
184-
const vector3_type upperHemisphereV = ieee754::flipSignIfRHSNegative<vector3_type>(localV, hlsl::promote<vector3_type>(interaction.getNdotV())); //hlsl::mix(localV, -localV, interaction.getNdotV() < scalar_type(0.0));
196+
const vector3_type upperHemisphereV = ieee754::flipSignIfRHSNegative<vector3_type>(localV, hlsl::promote<vector3_type>(interaction.getNdotV()));
185197
const vector3_type localH = ndf.generateH(upperHemisphereV, u.xy);
198+
const vector3_type H = hlsl::mul(interaction.getFromTangentSpace(), localH);
186199

187-
const scalar_type VdotH = hlsl::dot(localV, localH);
200+
const scalar_type VdotH = hlsl::dot(V.getDirection(), H);
188201
const scalar_type reflectance = fresnel(hlsl::abs(VdotH))[0];
189202

190203
scalar_type rcpChoiceProb;
191204
scalar_type z = u.z;
192205
bool transmitted = math::partitionRandVariable(reflectance, z, rcpChoiceProb);
193206

194-
Refract<scalar_type> r = Refract<scalar_type>::create(localV, localH);
195-
ray_dir_info_type localL;
207+
Refract<scalar_type> r = Refract<scalar_type>::create(V.getDirection(), H);
196208
bxdf::ReflectRefract<scalar_type> rr;
197209
rr.refract = r;
198-
localL = localL.reflectRefract(rr, transmitted, rcpEta.value[0]);
210+
ray_dir_info_type L = V.reflectRefract(rr, transmitted, rcpEta.value[0]);
199211

200212
// fail if samples have invalid paths
201-
// TODO fix this: if (ComputeMicrofacetNormal<scalar_type>::isTransmissionPath(VdotH, hlsl::dot(localL.getDirection(), localH)) != transmitted)
202-
if ((!transmitted && hlsl::sign(localL.getDirection().z) != hlsl::sign(localV.z)) || (transmitted && hlsl::sign(localL.getDirection().z) == hlsl::sign(localV.z)))
203-
{
204-
localL.direction = vector3_type(0,0,0); // should check if sample direction is invalid
205-
}
213+
if (ComputeMicrofacetNormal<scalar_type>::isTransmissionPath(VdotH, hlsl::dot(L.getDirection(), H)) != transmitted)
214+
L.direction = vector3_type(0,0,0); // should check if sample direction is invalid
206215
else
207-
cache = anisocache_type::create(localV, localH, transmitted, rcpEta);
216+
cache = anisocache_type::create(VdotH, L.getDirection(), H, interaction.getT(), interaction.getB(), interaction.getN(), transmitted);
208217

209-
return sample_type::createFromTangentSpace(localL, interaction.getFromTangentSpace());
218+
return sample_type::create(L, interaction.getT(), interaction.getB(), interaction.getN());
210219
}
211220
template<typename C=bool_constant<!IsAnisotropic>, typename D=bool_constant<!IsBSDF> >
212221
enable_if_t<C::value && !IsAnisotropic && D::value && !IsBSDF, sample_type> generate(NBL_CONST_REF_ARG(isotropic_interaction_type) interaction, const vector2_type u, NBL_REF_ARG(isocache_type) cache)

include/nbl/builtin/hlsl/bxdf/common.hlsl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,20 @@ struct SAnisotropicMicrofacetCache
768768
retval.BdotH = nbl::hlsl::dot<vector3_type>(interaction.getB(),H);
769769
return retval;
770770
}
771+
static this_t create(
772+
const scalar_type VdotH, const vector3_type L, const vector3_type H,
773+
const vector3_type T, const vector3_type B, const vector3_type N, bool transmitted
774+
)
775+
{
776+
this_t retval;
777+
retval.iso_cache.VdotH = VdotH;
778+
retval.iso_cache.LdotH = hlsl::mix(VdotH, hlsl::dot(L, H), transmitted);
779+
retval.iso_cache.absNdotH = hlsl::abs(hlsl::dot(N, H));
780+
retval.iso_cache.NdotH2 = retval.iso_cache.getAbsNdotH() * retval.iso_cache.getAbsNdotH();
781+
retval.TdotH = hlsl::dot(T, H);
782+
retval.BdotH = hlsl::dot(B, H);
783+
return retval;
784+
}
771785

772786
scalar_type getVdotL() NBL_CONST_MEMBER_FUNC { return iso_cache.getVdotL(); }
773787
scalar_type getVdotH() NBL_CONST_MEMBER_FUNC { return iso_cache.getVdotH(); }

0 commit comments

Comments
 (0)