Three.js中为何将alphaMap纹理采样的G通道与alpha分量相乘?
Three.js 开启USE_ALPHAMAP分支时透明度计算逻辑说明
对应实现代码:
export default /* glsl */` #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, vUv ).g; #endif `;
核心设计逻辑如下:
- 采样G通道是Three.js渲染管线延续至今的默认约定,不是GLSL语法或3D行业的强制标准。早期引擎做跨设备兼容性测试时发现,绝大多数不带Alpha通道的灰度遮罩图,RGB三个通道的数值完全一致;而当时移动端通用的ETC1等不支持透明通道的压缩纹理格式,对G通道的精度保留效果最好,压缩产生的色损最低,用G通道读取透明度遮罩能最大程度减少遮罩边缘锯齿、透明度阶跃错误的问题,这个约定就一直沿用了下来。
- 采用乘法赋值而非直接覆盖原值,是因为
diffuseColor.a在走到这个分支前,已经叠加计算了材质基础opacity属性、顶点色Alpha分量、基础色贴图自带Alpha通道的结果。alphaMap的定位是透明度遮罩权重,取值范围为0到1:0代表对应像素完全透明,1代表完全保留之前算出的基础透明度,乘法逻辑可以让原有透明度配置和遮罩效果叠加生效,不会覆盖用户提前设置的材质透明度、顶点色透明效果。
补充:如果你的自定义alphaMap把透明度存在R或者A通道,直接修改这里采样的通道即可,引擎默认写
.g只是为了统一默认资源的兼容表现,没有特殊的语法强制要求。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

