如何在OpenGL中同时显示立方体背景色以及两张纹理的颜色
问题原因
- 你在构造混合纹理色值时手动将alpha硬编码为
1.0,传入mix函数的第三个插值参数固定为1,会直接丢弃第一个参数的立方体背景色aColor,导致背景色完全不显示 - 手动计算RGBA混合的逻辑冗余,且完全丢弃了两张纹理自带的alpha通道信息,没有正确处理纹理透明区域和背景色的叠加逻辑
修正后的片元着色器代码
private final String fragmentShaderCode = "precision mediump float;" + "uniform sampler2D u_Texture0;" + "uniform sampler2D u_Texture1;" + "uniform vec4 aColor;" + "varying vec2 v_TexCoordinate0;" + "varying vec2 v_TexCoordinate1;" + "void main() {" + // 读取两张纹理的完整色值(含alpha) " vec4 base = texture2D(u_Texture0, v_TexCoordinate0);" + " vec4 overlay = texture2D(u_Texture1, v_TexCoordinate1);" + // 先按overlay的alpha混合两张纹理,保留混合后的alpha " vec4 texCombined = mix(base, overlay, overlay.a);" + // 再用混合后纹理的alpha作为权重,和立方体背景色混合 " vec4 finalColor = mix(aColor, texCombined, texCombined.a);" + // 输出最终颜色,alpha可根据需求调整为固定1.0 " gl_FragColor = finalColor;" + "}";
补充说明
如果你的两张纹理都是完全不透明的(alpha通道全为1),可以手动调整叠加权重控制背景色的透出比例,比如把混合权重改为0.7,就能同时显示70%的纹理内容+30%的立方体背景色:
vec4 finalColor = mix(aColor, texCombined, 0.7);
内容的提问来源于stack exchange,提问作者Bocho
相关产品推荐
相关产品推荐

