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
相关产品推荐
相关产品推荐

