forked from bartvdbraak/blender
Cycles: Consider GGX/Beckmann/Ashikhmin of 0 roughness a singular ray
This matches behavior of Multiscatter GGX and could become handy later on when/if we decide it would be beneficial to replace on closure with another. Reviewers: lukasstockner97, brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D2413
This commit is contained in:
parent
72d18c195e
commit
c4d6fd3ec0
@ -143,6 +143,7 @@ ccl_device int bsdf_ashikhmin_shirley_sample(const ShaderClosure *sc, float3 Ng,
|
|||||||
{
|
{
|
||||||
const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
|
const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
|
||||||
float3 N = bsdf->N;
|
float3 N = bsdf->N;
|
||||||
|
int label = LABEL_REFLECT | LABEL_GLOSSY;
|
||||||
|
|
||||||
float NdotI = dot(N, I);
|
float NdotI = dot(N, I);
|
||||||
if(NdotI > 0.0f) {
|
if(NdotI > 0.0f) {
|
||||||
@ -211,6 +212,7 @@ ccl_device int bsdf_ashikhmin_shirley_sample(const ShaderClosure *sc, float3 Ng,
|
|||||||
/* Some high number for MIS. */
|
/* Some high number for MIS. */
|
||||||
*pdf = 1e6f;
|
*pdf = 1e6f;
|
||||||
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
||||||
|
label = LABEL_REFLECT | LABEL_SINGULAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* leave the rest to eval_reflect */
|
/* leave the rest to eval_reflect */
|
||||||
@ -224,7 +226,7 @@ ccl_device int bsdf_ashikhmin_shirley_sample(const ShaderClosure *sc, float3 Ng,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return LABEL_REFLECT|LABEL_GLOSSY;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -452,6 +452,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
|
|||||||
float alpha_y = bsdf->alpha_y;
|
float alpha_y = bsdf->alpha_y;
|
||||||
bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
|
bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
|
||||||
float3 N = bsdf->N;
|
float3 N = bsdf->N;
|
||||||
|
int label;
|
||||||
|
|
||||||
float cosNO = dot(N, I);
|
float cosNO = dot(N, I);
|
||||||
if(cosNO > 0) {
|
if(cosNO > 0) {
|
||||||
@ -477,6 +478,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
|
|||||||
/* reflection or refraction? */
|
/* reflection or refraction? */
|
||||||
if(!m_refractive) {
|
if(!m_refractive) {
|
||||||
float cosMO = dot(m, I);
|
float cosMO = dot(m, I);
|
||||||
|
label = LABEL_REFLECT | LABEL_GLOSSY;
|
||||||
|
|
||||||
if(cosMO > 0) {
|
if(cosMO > 0) {
|
||||||
/* eq. 39 - compute actual reflected direction */
|
/* eq. 39 - compute actual reflected direction */
|
||||||
@ -487,6 +489,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
|
|||||||
/* some high number for MIS */
|
/* some high number for MIS */
|
||||||
*pdf = 1e6f;
|
*pdf = 1e6f;
|
||||||
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
||||||
|
label = LABEL_REFLECT | LABEL_SINGULAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* microfacet normal is visible to this ray */
|
/* microfacet normal is visible to this ray */
|
||||||
@ -549,6 +552,8 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
label = LABEL_TRANSMIT | LABEL_GLOSSY;
|
||||||
|
|
||||||
/* CAUTION: the i and o variables are inverted relative to the paper
|
/* CAUTION: the i and o variables are inverted relative to the paper
|
||||||
* eq. 39 - compute actual refractive direction */
|
* eq. 39 - compute actual refractive direction */
|
||||||
float3 R, T;
|
float3 R, T;
|
||||||
@ -576,6 +581,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
|
|||||||
/* some high number for MIS */
|
/* some high number for MIS */
|
||||||
*pdf = 1e6f;
|
*pdf = 1e6f;
|
||||||
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
||||||
|
label = LABEL_TRANSMIT | LABEL_SINGULAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* eq. 33 */
|
/* eq. 33 */
|
||||||
@ -607,7 +613,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (m_refractive) ? LABEL_TRANSMIT|LABEL_GLOSSY : LABEL_REFLECT|LABEL_GLOSSY;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Beckmann microfacet with Smith shadow-masking from:
|
/* Beckmann microfacet with Smith shadow-masking from:
|
||||||
@ -815,6 +821,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
|
|||||||
float alpha_y = bsdf->alpha_y;
|
float alpha_y = bsdf->alpha_y;
|
||||||
bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
|
bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
|
||||||
float3 N = bsdf->N;
|
float3 N = bsdf->N;
|
||||||
|
int label;
|
||||||
|
|
||||||
float cosNO = dot(N, I);
|
float cosNO = dot(N, I);
|
||||||
if(cosNO > 0) {
|
if(cosNO > 0) {
|
||||||
@ -839,6 +846,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
|
|||||||
|
|
||||||
/* reflection or refraction? */
|
/* reflection or refraction? */
|
||||||
if(!m_refractive) {
|
if(!m_refractive) {
|
||||||
|
label = LABEL_REFLECT | LABEL_GLOSSY;
|
||||||
float cosMO = dot(m, I);
|
float cosMO = dot(m, I);
|
||||||
|
|
||||||
if(cosMO > 0) {
|
if(cosMO > 0) {
|
||||||
@ -850,6 +858,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
|
|||||||
/* some high number for MIS */
|
/* some high number for MIS */
|
||||||
*pdf = 1e6f;
|
*pdf = 1e6f;
|
||||||
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
||||||
|
label = LABEL_REFLECT | LABEL_SINGULAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* microfacet normal is visible to this ray
|
/* microfacet normal is visible to this ray
|
||||||
@ -904,6 +913,8 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
label = LABEL_TRANSMIT | LABEL_GLOSSY;
|
||||||
|
|
||||||
/* CAUTION: the i and o variables are inverted relative to the paper
|
/* CAUTION: the i and o variables are inverted relative to the paper
|
||||||
* eq. 39 - compute actual refractive direction */
|
* eq. 39 - compute actual refractive direction */
|
||||||
float3 R, T;
|
float3 R, T;
|
||||||
@ -931,6 +942,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
|
|||||||
/* some high number for MIS */
|
/* some high number for MIS */
|
||||||
*pdf = 1e6f;
|
*pdf = 1e6f;
|
||||||
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
*eval = make_float3(1e6f, 1e6f, 1e6f);
|
||||||
|
label = LABEL_TRANSMIT | LABEL_SINGULAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* eq. 33 */
|
/* eq. 33 */
|
||||||
@ -963,7 +975,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (m_refractive) ? LABEL_TRANSMIT|LABEL_GLOSSY : LABEL_REFLECT|LABEL_GLOSSY;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
CCL_NAMESPACE_END
|
CCL_NAMESPACE_END
|
||||||
|
Loading…
Reference in New Issue
Block a user