@@ -25,7 +25,7 @@ struct PointIndexData {
25
25
};
26
26
27
27
struct BSDFMaterial {
28
- vec4 diffuse ;
28
+ vec4 diffuseAndAlphaCutoff ;
29
29
30
30
vec4 specularColor;
31
31
@@ -140,6 +140,10 @@ struct HitShadingData {
140
140
float materialIOR;
141
141
};
142
142
143
+ bool _isUseAlphaAsCoverageInsteadOfTransmission(float alphaCutoff) {
144
+ return alphaCutoff > 0.0 ;
145
+ }
146
+
143
147
HitShadingData getHitShadingData(uint instanceIndex, uint primitiveIndex) {
144
148
InstanceData instanceData = _getInstanceData(instanceIndex);
145
149
@@ -184,15 +188,22 @@ HitShadingData getHitShadingData(uint instanceIndex, uint primitiveIndex) {
184
188
185
189
HitShadingData data;
186
190
191
+ float alphaCutoff = mat.diffuseAndAlphaCutoff.w;
192
+ float alpha = 1.0 ;
193
+
187
194
if (_hasMap(diffuseMapLayerIndex)) {
195
+ vec4 diffuseMapData =
196
+ texture(sampler2DArray (textureArray, textureSampler),
197
+ vec3 (uv * mat.diffuseMapScale, diffuseMapLayerIndex));
198
+
188
199
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;
194
203
} else {
195
- data.materialDiffuse = vec3 (mat.diffuse);
204
+ data.materialDiffuse = mat.diffuseAndAlphaCutoff.xyz;
205
+
206
+ alpha = 1.0 ;
196
207
}
197
208
198
209
if (_hasMap(specularMapLayerIndex)) {
@@ -245,18 +256,24 @@ HitShadingData getHitShadingData(uint instanceIndex, uint primitiveIndex) {
245
256
data.materialRoughness = mat.roughness;
246
257
}
247
258
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 ;
254
262
} 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;
256
275
}
257
276
258
- data.materialIOR = mat.ior;
259
-
260
277
const vec3 p0 = v0.position.xyz, p1 = v1.position.xyz, p2 = v2.position.xyz;
261
278
262
279
vec3 localPos = _blerp(attribs.xy, p0.xyz, p1.xyz, p2.xyz);
0 commit comments