You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android OpenGL 立方体结合变色与透明纹理显示异常问题求助

问题解决方法

你的异常是三个配置错误共同导致的:

  • draw方法中顶点颜色的Alpha值被设为0,导致纹理和顶点颜色混合后整体透明度异常
  • 未开启Alpha混合,纹理的透明通道无法正常生效,透明区域直接渲染为黑色
  • 默认纹理混合模式下,顶点透明值会直接叠加到纹理的Alpha通道上,导致原本不透明的白色图案也变成透明状态

具体修改步骤

1. 修正顶点颜色的Alpha值

找到Cube.java的draw方法中glColor4f调用,将最后一个参数从0.0f改为1.0f:

// 修改前
gl.glColor4f((Color.red(colors[colorIndex])) / 255.0f, (Color.green(colors[colorIndex])) / 255.0f, (Color.blue(colors[colorIndex])) / 255.0f, 0.0f);
// 修改后
gl.glColor4f((Color.red(colors[colorIndex])) / 255.0f, (Color.green(colors[colorIndex])) / 255.0f, (Color.blue(colors[colorIndex])) / 255.0f, 1.0f);

原理:glColor4f最后一个参数为透明度,1为完全不透明,0为完全透明。你原本设为0会导致整个立方体的顶点全透明,纹理叠加后也会继承透明属性

2. 开启Alpha混合功能

在MyGLRenderer.java的onSurfaceCreated方法末尾添加混合配置:

// 开启Alpha混合
gl.glEnable(GL10.GL_BLEND);
// 设置混合规则:用纹理的Alpha值作为混合权重
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

原理:OpenGL ES默认不处理Alpha通道,开启混合后才会根据纹理的透明值叠加背景颜色,避免透明区域显示为黑色

3. 配置纹理环境模式

在Cube.draw方法绑定纹理后添加以下代码,根据需求选择混合模式:

// 模式1:白色图案跟随立方体动态变色,建议默认用这个
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);

// 模式2:白色图案保持纯白色,仅立方体透明背景区域动态变色
// gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_DECAL);

4. 修复颜色计时器的小bug

你当前的colorTimer逻辑存在重复累加的问题,修改draw方法末尾的计时器逻辑即可:

// 修改后
colorTimer++;
if (colorTimer >= colorWait) {
    colorTimer = 0;
    colorIndex = (colorIndex + 1) % colors.length;
}

原理:原逻辑中满足条件时colorTimer会每次加2,导致变色速度比预期快一倍


内容的提问来源于stack exchange,提问作者blinero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:15:03