Skip to content

Commit e3bfa80

Browse files
author
Mike Bond
committed
Change albedo to base color
1 parent b2bf2c3 commit e3bfa80

File tree

10 files changed

+245
-15
lines changed

10 files changed

+245
-15
lines changed

packages/dev/core/src/Materials/PBR/openPbrMaterial.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ export class OpenPBRMaterial extends OpenPBRMaterialBase {
483483
public baseColorTexture: BaseTexture;
484484
@addAccessorsForMaterialProperty("_markAllSubMeshesAsTexturesDirty", "baseColorTexture")
485485
// eslint-disable-next-line @typescript-eslint/no-unused-vars
486-
private _baseColorTexture: Sampler = new Sampler("base_color", "baseColor", "ALBEDO");
486+
private _baseColorTexture: Sampler = new Sampler("base_color", "baseColor", "BASE_COLOR");
487487

488488
/**
489489
* Roughness of the diffuse lobe.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
struct albedoOpacityOutParams
2+
{
3+
vec3 surfaceAlbedo;
4+
float alpha;
5+
};
6+
7+
#define pbr_inline
8+
albedoOpacityOutParams albedoOpacityBlock(
9+
in vec4 vAlbedoColor
10+
#ifdef BASE_COLOR
11+
,in vec4 albedoTexture
12+
,in vec2 albedoInfos
13+
#endif
14+
, in float baseWeight
15+
#ifdef BASE_WEIGHT
16+
, in vec4 baseWeightTexture
17+
, in vec2 vBaseWeightInfos
18+
#endif
19+
#ifdef OPACITY
20+
,in vec4 opacityMap
21+
,in vec2 vOpacityInfos
22+
#endif
23+
#ifdef DETAIL
24+
,in vec4 detailColor
25+
,in vec4 vDetailInfos
26+
#endif
27+
#ifdef DECAL
28+
,in vec4 decalColor
29+
,in vec4 vDecalInfos
30+
#endif
31+
)
32+
{
33+
albedoOpacityOutParams outParams;
34+
// _____________________________ Albedo Information ______________________________
35+
vec3 surfaceAlbedo = vAlbedoColor.rgb;
36+
float alpha = vAlbedoColor.a;
37+
38+
#ifdef BASE_COLOR
39+
#if defined(ALPHAFROMALBEDO) || defined(ALPHATEST)
40+
alpha *= albedoTexture.a;
41+
#endif
42+
43+
#ifdef BASE_COLOR_GAMMA
44+
surfaceAlbedo *= toLinearSpace(albedoTexture.rgb);
45+
#else
46+
surfaceAlbedo *= albedoTexture.rgb;
47+
#endif
48+
49+
surfaceAlbedo *= albedoInfos.y;
50+
#endif
51+
52+
#ifndef DECAL_AFTER_DETAIL
53+
#include<decalFragment>
54+
#endif
55+
56+
#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)
57+
surfaceAlbedo *= vColor.rgb;
58+
#endif
59+
60+
#ifdef DETAIL
61+
float detailAlbedo = 2.0 * mix(0.5, detailColor.r, vDetailInfos.y);
62+
surfaceAlbedo.rgb = surfaceAlbedo.rgb * detailAlbedo * detailAlbedo; // should be pow(detailAlbedo, 2.2) but detailAlbedo² is close enough and cheaper to compute
63+
#endif
64+
65+
#ifdef DECAL_AFTER_DETAIL
66+
#include<decalFragment>
67+
#endif
68+
69+
#define CUSTOM_FRAGMENT_UPDATE_ALBEDO
70+
71+
// According to OpenPBR:
72+
// - for metals, base_weight is a factor to the base_color (F0, thus surfaceAlbedo in
73+
// Babylons.js).
74+
// - for dielectrics, base_weight is a factor to the diffuse BRDF (i.e. it should be
75+
// applied in computeDiffuseLighting), but with the diffuse model *currently* used
76+
// in Babylon.js, factoring it into the surfaceAlbedo is equivalent.
77+
surfaceAlbedo *= baseWeight;
78+
#ifdef BASE_WEIGHT
79+
surfaceAlbedo *= baseWeightTexture.r;
80+
#endif
81+
82+
// _____________________________ Alpha Information _______________________________
83+
#ifdef OPACITY
84+
#ifdef OPACITYRGB
85+
alpha = getLuminance(opacityMap.rgb);
86+
#else
87+
alpha *= opacityMap.a;
88+
#endif
89+
90+
alpha *= vOpacityInfos.y;
91+
#endif
92+
93+
#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)
94+
alpha *= vColor.a;
95+
#endif
96+
97+
#if !defined(SS_LINKREFRACTIONTOTRANSPARENCY) && !defined(ALPHAFRESNEL)
98+
#ifdef ALPHATEST
99+
#if DEBUGMODE != 88
100+
if (alpha < ALPHATESTVALUE)
101+
discard;
102+
#endif
103+
104+
#ifndef ALPHABLEND
105+
// Prevent to blend with the canvas.
106+
alpha = 1.0;
107+
#endif
108+
#endif
109+
#endif
110+
111+
outParams.surfaceAlbedo = surfaceAlbedo;
112+
outParams.alpha = alpha;
113+
114+
return outParams;
115+
}

packages/dev/core/src/Shaders/ShadersInclude/openpbrFragmentDeclaration.fx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ uniform float visibility;
1515
uniform vec3 vAmbientColor;
1616

1717
// Samplers
18-
#ifdef ALBEDO
18+
#ifdef BASE_COLOR
1919
uniform vec2 vBaseColorInfos;
2020
#endif
2121

packages/dev/core/src/Shaders/ShadersInclude/openpbrFragmentSamplersDeclaration.fx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include<samplerFragmentDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,BaseColor,_SAMPLERNAME_,baseColor)
1+
#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,BaseColor,_SAMPLERNAME_,baseColor)
22
#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight)
33
#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_SAMPLERNAME_,baseDiffuseRoughness)
44
#include<samplerFragmentDeclaration>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)

packages/dev/core/src/Shaders/openpbr.fragment.fx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ precision highp float;
6060

6161
#define CUSTOM_FRAGMENT_DEFINITIONS
6262

63-
#include<pbrBlockAlbedoOpacity>
63+
#include<openpbrBlockAlbedoOpacity>
6464
#include<openpbrBlockReflectivity>
6565
#include<pbrBlockAmbientOcclusion>
6666
#include<pbrBlockAlphaFresnel>
@@ -83,7 +83,7 @@ void main(void) {
8383
// _____________________________ Albedo & Opacity ______________________________
8484
albedoOpacityOutParams albedoOpacityOut;
8585

86-
#ifdef ALBEDO
86+
#ifdef BASE_COLOR
8787
vec4 baseColorFromTexture = texture2D(baseColorSampler, vBaseColorUV + uvOffset);
8888
#endif
8989

@@ -101,7 +101,7 @@ void main(void) {
101101

102102
albedoOpacityOut = albedoOpacityBlock(
103103
vBaseColor
104-
#ifdef ALBEDO
104+
#ifdef BASE_COLOR
105105
, baseColorFromTexture
106106
, vBaseColorInfos
107107
#endif
@@ -145,7 +145,6 @@ void main(void) {
145145

146146

147147

148-
149148
// _____________________________ AO _______________________________
150149
ambientOcclusionOutParams aoOut;
151150

packages/dev/core/src/Shaders/openpbr.vertex.fx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ attribute vec4 color;
3333
#include<instancesDeclaration>
3434
#include<prePassVertexDeclaration>
3535

36-
#include<samplerVertexDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)
36+
#include<samplerVertexDeclaration>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,BaseColor)
3737
#include<samplerVertexDeclaration>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight)
3838
#include<samplerVertexDeclaration>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness)
3939
#include<samplerVertexDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)
@@ -212,7 +212,7 @@ void main(void) {
212212

213213
#include<uvVariableDeclaration>[3..7]
214214

215-
#include<samplerVertexImplementation>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x)
215+
#include<samplerVertexImplementation>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,BaseColor,_MATRIXNAME_,albedo,_INFONAME_,BaseColorInfos.x)
216216
#include<samplerVertexImplementation>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_MATRIXNAME_,baseWeight,_INFONAME_,BaseWeightInfos.x)
217217
#include<samplerVertexImplementation>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_MATRIXNAME_,baseDiffuseRoughness,_INFONAME_,BaseDiffuseRoughnessInfos.x)
218218
#include<samplerVertexImplementation>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
struct albedoOpacityOutParams
2+
{
3+
surfaceAlbedo: vec3f,
4+
alpha: f32
5+
};
6+
7+
#define pbr_inline
8+
fn albedoOpacityBlock(
9+
vAlbedoColor: vec4f
10+
#ifdef BASE_COLOR
11+
,albedoTexture: vec4f
12+
,albedoInfos: vec2f
13+
#endif
14+
, baseWeight: f32
15+
#ifdef BASE_WEIGHT
16+
, baseWeightTexture: vec4f
17+
, vBaseWeightInfos: vec2f
18+
#endif
19+
#ifdef OPACITY
20+
,opacityMap: vec4f
21+
,vOpacityInfos: vec2f
22+
#endif
23+
#ifdef DETAIL
24+
,detailColor: vec4f
25+
,vDetailInfos: vec4f
26+
#endif
27+
#ifdef DECAL
28+
,decalColor: vec4f
29+
,vDecalInfos: vec4f
30+
#endif
31+
) -> albedoOpacityOutParams
32+
{
33+
var outParams: albedoOpacityOutParams;
34+
// _____________________________ Albedo Information ______________________________
35+
var surfaceAlbedo: vec3f = vAlbedoColor.rgb;
36+
var alpha: f32 = vAlbedoColor.a;
37+
38+
#ifdef BASE_COLOR
39+
#if defined(ALPHAFROMALBEDO) || defined(ALPHATEST)
40+
alpha *= albedoTexture.a;
41+
#endif
42+
43+
#ifdef BASE_COLOR_GAMMA
44+
surfaceAlbedo *= toLinearSpaceVec3(albedoTexture.rgb);
45+
#else
46+
surfaceAlbedo *= albedoTexture.rgb;
47+
#endif
48+
49+
surfaceAlbedo *= albedoInfos.y;
50+
#endif
51+
52+
#ifndef DECAL_AFTER_DETAIL
53+
#include<decalFragment>
54+
#endif
55+
56+
#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)
57+
surfaceAlbedo *= fragmentInputs.vColor.rgb;
58+
#endif
59+
60+
#ifdef DETAIL
61+
var detailAlbedo: f32 = 2.0 * mix(0.5, detailColor.r, vDetailInfos.y);
62+
surfaceAlbedo = surfaceAlbedo.rgb * detailAlbedo * detailAlbedo; // should be pow(detailAlbedo, 2.2) but detailAlbedo² is close enough and cheaper to compute
63+
#endif
64+
65+
#ifdef DECAL_AFTER_DETAIL
66+
#include<decalFragment>
67+
#endif
68+
69+
#define CUSTOM_FRAGMENT_UPDATE_ALBEDO
70+
71+
// According to OpenPBR:
72+
// - for metals, base_weight is a factor to the base_color (F0, thus surfaceAlbedo in
73+
// Babylons.js).
74+
// - for dielectrics, base_weight is a factor to the diffuse BRDF (i.e. it should be
75+
// applied in computeDiffuseLighting), but with the diffuse model *currently* used
76+
// in Babylon.js, factoring it into the surfaceAlbedo is equivalent.
77+
surfaceAlbedo *= baseWeight;
78+
#ifdef BASE_WEIGHT
79+
surfaceAlbedo *= baseWeightTexture.r;
80+
#endif
81+
82+
// _____________________________ Alpha Information _______________________________
83+
#ifdef OPACITY
84+
#ifdef OPACITYRGB
85+
alpha = getLuminance(opacityMap.rgb);
86+
#else
87+
alpha *= opacityMap.a;
88+
#endif
89+
90+
alpha *= vOpacityInfos.y;
91+
#endif
92+
93+
#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)
94+
alpha *= fragmentInputs.vColor.a;
95+
#endif
96+
97+
#if !defined(SS_LINKREFRACTIONTOTRANSPARENCY) && !defined(ALPHAFRESNEL)
98+
#ifdef ALPHATEST
99+
#if DEBUGMODE != 88
100+
if (alpha < ALPHATESTVALUE) {
101+
discard;
102+
}
103+
#endif
104+
105+
#ifndef ALPHABLEND
106+
// Prevent to blend with the canvas.
107+
alpha = 1.0;
108+
#endif
109+
#endif
110+
#endif
111+
112+
outParams.surfaceAlbedo = surfaceAlbedo;
113+
outParams.alpha = alpha;
114+
115+
return outParams;
116+
}

packages/dev/core/src/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.fx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include<samplerFragmentDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,BaseColor,_SAMPLERNAME_,baseColor)
1+
#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,BaseColor,_SAMPLERNAME_,baseColor)
22
#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight)
33
#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_SAMPLERNAME_,baseDiffuseRoughness)
44
#include<samplerFragmentDeclaration>(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient)

packages/dev/core/src/ShadersWGSL/openpbr.fragment.fx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444

4545
#define CUSTOM_FRAGMENT_DEFINITIONS
4646

47-
#include<pbrBlockAlbedoOpacity>
47+
#include<openpbrBlockAlbedoOpacity>
4848
#include<openpbrBlockReflectivity>
4949
#include<pbrBlockAmbientOcclusion>
5050
#include<pbrBlockAlphaFresnel>
@@ -68,7 +68,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs {
6868
// _____________________________ Albedo & Opacity ______________________________
6969
var albedoOpacityOut: albedoOpacityOutParams;
7070

71-
#ifdef ALBEDO
71+
#ifdef BASE_COLOR
7272
var baseColorFromTexture: vec4f = textureSample(baseColorSampler, baseColorSamplerSampler, fragmentInputs.vBaseColorUV + uvOffset);
7373
#endif
7474

@@ -86,7 +86,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs {
8686

8787
albedoOpacityOut = albedoOpacityBlock(
8888
uniforms.vBaseColor
89-
#ifdef ALBEDO
89+
#ifdef BASE_COLOR
9090
, baseColorFromTexture
9191
, uniforms.vBaseColorInfos
9292
#endif

packages/dev/core/src/ShadersWGSL/openpbr.vertex.fx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ attribute color: vec4f;
2929
#include<instancesDeclaration>
3030
#include<prePassVertexDeclaration>
3131

32-
#include<samplerVertexDeclaration>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo)
32+
#include<samplerVertexDeclaration>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,Albedo)
3333
#include<samplerVertexDeclaration>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight)
3434
#include<samplerVertexDeclaration>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness)
3535
#include<samplerVertexDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail)
@@ -199,7 +199,7 @@ fn main(input : VertexInputs) -> FragmentInputs {
199199

200200
#include<uvVariableDeclaration>[3..7]
201201

202-
#include<samplerVertexImplementation>(_DEFINENAME_,ALBEDO,_VARYINGNAME_,BaseColor,_MATRIXNAME_,baseColor,_INFONAME_,BaseColorInfos.x)
202+
#include<samplerVertexImplementation>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,BaseColor,_MATRIXNAME_,baseColor,_INFONAME_,BaseColorInfos.x)
203203
#include<samplerVertexImplementation>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_MATRIXNAME_,baseWeight,_INFONAME_,BaseWeightInfos.x)
204204
#include<samplerVertexImplementation>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_MATRIXNAME_,baseDiffuseRoughness,_INFONAME_,BaseDiffuseRoughnessInfos.x)
205205
#include<samplerVertexImplementation>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x)

0 commit comments

Comments
 (0)