Skip to content

Commit 5932613

Browse files
committed
feat(architecture): support alpha as coverage
ISceneGraphRepoDp->bsdfMaterialRepo add getAlphaCutoff; fix get_hit_shading_data.glsl; fix UpdatePathTracingCPJobEntity->_buildAndSetBSDFMaterialBufferData;
1 parent a9df3bb commit 5932613

File tree

12 files changed

+81
-18
lines changed

12 files changed

+81
-18
lines changed

src/construct/application_layer/scene/BSDFMaterialApService.re

+4
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ let getSpecularMapImageId = material => {
5252
OperateBSDFMaterialDoService.getSpecularMapImageId(material);
5353
};
5454

55+
let getAlphaCutoff = material => {
56+
OperateBSDFMaterialDoService.getAlphaCutoff(material);
57+
};
58+
5559
let isSame = (material1, material2) => {
5660
OperateBSDFMaterialDoService.isSame(material1, material2);
5761
};

src/construct/domain_layer/dependency/interface/engine/ISceneGraphRepoDp.re

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ type bsdfMaterialRepo = {
6363
getNormalMapImageId: bsdfMaterial => option(ImageRepoType.id),
6464
getTransmissionMapImageId: bsdfMaterial => option(ImageRepoType.id),
6565
getSpecularMapImageId: bsdfMaterial => option(ImageRepoType.id),
66+
// isUseAlphaBlend: bsdfMaterial => bool,
67+
getAlphaCutoff: bsdfMaterial => float,
6668
isSame: (bsdfMaterial, bsdfMaterial) => bool,
6769
getId: bsdfMaterial => int,
6870
};

src/construct/domain_layer/domain/scene/scene_graph/service/bsdf_material/OperateBSDFMaterialDoService.re

+6
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ let getSpecularMapImageId = material =>
7979
)
8080
->OptionSt.map(ImageIdVO.create);
8181

82+
let getAlphaCutoff = material =>
83+
DpContainer.unsafeGetBSDFMaterialRepoDp().getAlphaCutoff(
84+
material->BSDFMaterialEntity.value,
85+
)
86+
->AlphaCutoffVO.create;
87+
8288
let isSame = (material1, material2) => {
8389
DpContainer.unsafeGetBSDFMaterialRepoDp().isSame(
8490
material1->BSDFMaterialEntity.value,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
type t =
2+
| AlphaCutoff(float);
3+
4+
let create = value => AlphaCutoff(value);
5+
6+
let value = alphaCutoff =>
7+
switch (alphaCutoff) {
8+
| AlphaCutoff(value) => value
9+
};

src/construct/external_layer/api/domain/BSDFMaterialRunAPI.re

+4
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ let getSpecularMapImageId = material => {
5050
BSDFMaterialApService.getSpecularMapImageId(material);
5151
};
5252

53+
let getAlphaCutoff = material => {
54+
BSDFMaterialApService.getAlphaCutoff(material);
55+
};
56+
5357
let isSame = (material1, material2) => {
5458
BSDFMaterialApService.isSame(material1, material2);
5559
};

src/run/domain_layer/domain/pipeline/pipeline/entity/jobs/update/UpdatePathTracingCPJobEntity.re

+8
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,9 @@ let _buildAndSetBSDFMaterialBufferData = (device, allRenderBSDFMaterials) => {
480480
let diffuse =
481481
BSDFMaterialRunAPI.getDiffuseColor(bsdfMaterial)
482482
->DiffuseVO.getPrimitiveValue;
483+
let alphaCutoff =
484+
BSDFMaterialRunAPI.getAlphaCutoff(bsdfMaterial)
485+
->AlphaCutoffVO.value;
483486
let specularColor =
484487
BSDFMaterialRunAPI.getSpecularColor(bsdfMaterial)
485488
->SpecularColorVO.getPrimitiveValue;
@@ -530,6 +533,11 @@ let _buildAndSetBSDFMaterialBufferData = (device, allRenderBSDFMaterials) => {
530533
) => {
531534
ListResult.mergeResults([
532535
TypeArrayCPRepoUtils.setFloat3(offset + 0, diffuse, bufferData),
536+
TypeArrayCPRepoUtils.setFloat1(
537+
offset + 3,
538+
alphaCutoff,
539+
bufferData,
540+
),
533541
TypeArrayCPRepoUtils.setFloat3(
534542
offset + 4,
535543
specularColor,

src/run/domain_layer/domain/shader/ray_tracing/get_hit_shading_data.glsl

+33-16
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ struct PointIndexData {
2525
};
2626

2727
struct BSDFMaterial {
28-
vec4 diffuse;
28+
vec4 diffuseAndAlphaCutoff;
2929

3030
vec4 specularColor;
3131

@@ -140,6 +140,10 @@ struct HitShadingData {
140140
float materialIOR;
141141
};
142142

143+
bool _isUseAlphaAsCoverageInsteadOfTransmission(float alphaCutoff) {
144+
return alphaCutoff > 0.0;
145+
}
146+
143147
HitShadingData getHitShadingData(uint instanceIndex, uint primitiveIndex) {
144148
InstanceData instanceData = _getInstanceData(instanceIndex);
145149

@@ -184,15 +188,22 @@ HitShadingData getHitShadingData(uint instanceIndex, uint primitiveIndex) {
184188

185189
HitShadingData data;
186190

191+
float alphaCutoff = mat.diffuseAndAlphaCutoff.w;
192+
float alpha = 1.0;
193+
187194
if (_hasMap(diffuseMapLayerIndex)) {
195+
vec4 diffuseMapData =
196+
texture(sampler2DArray(textureArray, textureSampler),
197+
vec3(uv * mat.diffuseMapScale, diffuseMapLayerIndex));
198+
188199
data.materialDiffuse =
189-
convertSRGBToLinear(
190-
texture(sampler2DArray(textureArray, textureSampler),
191-
vec3(uv * mat.diffuseMapScale, diffuseMapLayerIndex))
192-
.rgb) +
193-
vec3(mat.diffuse);
200+
convertSRGBToLinear(diffuseMapData.rgb) + mat.diffuseAndAlphaCutoff.xyz;
201+
202+
alpha = diffuseMapData.a;
194203
} else {
195-
data.materialDiffuse = vec3(mat.diffuse);
204+
data.materialDiffuse = mat.diffuseAndAlphaCutoff.xyz;
205+
206+
alpha = 1.0;
196207
}
197208

198209
if (_hasMap(specularMapLayerIndex)) {
@@ -245,18 +256,24 @@ HitShadingData getHitShadingData(uint instanceIndex, uint primitiveIndex) {
245256
data.materialRoughness = mat.roughness;
246257
}
247258

248-
if (_hasMap(transmissionMapLayerIndex)) {
249-
data.materialTransmission =
250-
texture(sampler2DArray(textureArray, textureSampler),
251-
vec3(uv * mat.transmissionMapScale, transmissionMapLayerIndex))
252-
.r *
253-
mat.transmission;
259+
if (_isUseAlphaAsCoverageInsteadOfTransmission(alphaCutoff)) {
260+
data.materialTransmission = alpha >= alphaCutoff ? 0.0 : 1.0 - alpha;
261+
data.materialIOR = 1.0;
254262
} else {
255-
data.materialTransmission = mat.transmission;
263+
if (_hasMap(transmissionMapLayerIndex)) {
264+
data.materialTransmission =
265+
texture(
266+
sampler2DArray(textureArray, textureSampler),
267+
vec3(uv * mat.transmissionMapScale, transmissionMapLayerIndex))
268+
.r *
269+
mat.transmission;
270+
} else {
271+
data.materialTransmission = mat.transmission;
272+
}
273+
274+
data.materialIOR = mat.ior;
256275
}
257276

258-
data.materialIOR = mat.ior;
259-
260277
const vec3 p0 = v0.position.xyz, p1 = v1.position.xyz, p2 = v2.position.xyz;
261278

262279
vec3 localPos = _blerp(attribs.xy, p0.xyz, p1.xyz, p2.xyz);

src/run/external_layer/api/dependency/SceneGraphRepoDpCPAPI.re

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ let set =
3838
getNormalMapImageId,
3939
getTransmissionMapImageId,
4040
getSpecularMapImageId,
41+
getAlphaCutoff,
4142
isSame: isSameBSDFMaterial,
4243
getId: getBSDFMaterialId,
4344
}: SceneGraphRepoDpCPType.bsdfMaterialRepo = bsdfMaterialRepo;
@@ -130,6 +131,7 @@ let set =
130131
getSpecularMapImageId: bsdfMaterial => {
131132
getSpecularMapImageId(bsdfMaterial)->OptionSt.fromNullable;
132133
},
134+
getAlphaCutoff,
133135
},
134136
geometryRepo: {
135137
isSame: isSameGeometry,

src/run/external_layer/api/dependency/vo/SceneGraphRepoDpCPType.re

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type bsdfMaterialRepo = {
4747
getNormalMapImageId: bsdfMaterial => Js.Nullable.t(ImageRepoType.id),
4848
getTransmissionMapImageId: bsdfMaterial => Js.Nullable.t(ImageRepoType.id),
4949
getSpecularMapImageId: bsdfMaterial => Js.Nullable.t(ImageRepoType.id),
50+
getAlphaCutoff: bsdfMaterial => float,
5051
isSame: (bsdfMaterial, bsdfMaterial) => bool,
5152
getId: bsdfMaterial => int,
5253
};

test/construct/tool/SceneGraphRepoDependencyTool.re

+2
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ let buildBSDFMaterialRepo =
139139
~getMetalness=createEmptyStub(refJsObjToSandbox(sandbox^)),
140140
~getTransmission=createEmptyStub(refJsObjToSandbox(sandbox^)),
141141
~getIOR=createEmptyStub(refJsObjToSandbox(sandbox^)),
142+
~getAlphaCutoff=createEmptyStub(refJsObjToSandbox(sandbox^)),
142143
~getDiffuseMapImageId=createEmptyStub(refJsObjToSandbox(sandbox^)),
143144
~getChannelRoughnessMetallicMapImageId=createEmptyStub(
144145
refJsObjToSandbox(sandbox^),
@@ -167,6 +168,7 @@ let buildBSDFMaterialRepo =
167168
getNormalMapImageId,
168169
getTransmissionMapImageId,
169170
getSpecularMapImageId,
171+
getAlphaCutoff,
170172
};
171173

172174
let buildGeometryRepo =

test/run/integration/updatePathTracingCPJob_test.re

+2-2
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,7 @@ let _ =
12721272
)
12731273
});
12741274
testPromise(
1275-
"set each render bsdfMaterial's diffuse, specular, specularColor, roughness, metalness, transmission, ior, diffuseMapLayerIndex, channelRoughnessMetallicMapLayerIndex, emissionMapLayerIndex, normalMapLayerIndex, transmissionMapLayerIndex, specularMapLayerIndex, diffuseMapScale, channelRoughnessMetallicScaleScale, emissionMapScale, normalMapScale, transmissionMapScale, specularMapScale to buffer data",
1275+
"set each render bsdfMaterial's diffuse, alphaCutoff, specular, specularColor, roughness, metalness, transmission, ior, diffuseMapLayerIndex, channelRoughnessMetallicMapLayerIndex, emissionMapLayerIndex, normalMapLayerIndex, transmissionMapLayerIndex, specularMapLayerIndex, diffuseMapScale, channelRoughnessMetallicScaleScale, emissionMapScale, normalMapScale, transmissionMapScale, specularMapScale to buffer data",
12761276
() => {
12771277
open ImageRepoType;
12781278
let (
@@ -1333,7 +1333,7 @@ let _ =
13331333
0.,
13341334
1.,
13351335
0.,
1336-
0.,
1336+
0.5,
13371337
0.5,
13381338
1.,
13391339
0.,

test/run/tool/BSDFMaterialCPTool.re

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ let buildRepoWithTwoMaterialsAndMapData = sandbox => {
66

77
let diffuseColor1 = (1., 0., 0.);
88
let diffuseColor2 = (0., 1., 0.);
9+
let alphaCutoff1 = 0.0;
10+
let alphaCutoff2 = 0.5;
911
let specular1 = 0.5;
1012
let specular2 = 1.0;
1113
let specularColor1 = (0.5, 0., 0.);
@@ -92,6 +94,12 @@ let buildRepoWithTwoMaterialsAndMapData = sandbox => {
9294
| material when material == material1 => diffuseColor1
9395
| material when material == material2 => diffuseColor2
9496
},
97+
~getAlphaCutoff=
98+
material =>
99+
switch (material) {
100+
| material when material == material1 => alphaCutoff1
101+
| material when material == material2 => alphaCutoff2
102+
},
95103
~getSpecular=
96104
material =>
97105
switch (material) {

0 commit comments

Comments
 (0)