Android OpenGL开发:如何同时保留立方体本身颜色和纹理原始色彩
解决方案
问题1:颜色属性类型定义与赋值逻辑不匹配
你当前顶点着色器中将aColor定义为attribute(逐顶点属性),但实际代码中使用glUniform4fv(全局统一变量赋值方法)给它传值,逻辑完全不匹配,导致基础颜色读取异常。且当前设置的基础颜色alpha通道为0,完全透明,自然看不出叠加效果。
修复步骤:
- 调整顶点着色器,删除不需要的
varying vec4 vColor相关代码,将aColor改为全局uniform变量:
private final String vertexShaderCode = "uniform mat4 uMVPMatrix;" + "attribute vec4 vPosition;" + "attribute vec2 a_TexCoordinate;" + "varying vec2 v_TexCoordinate;" + "void main() {" + " gl_Position = uMVPMatrix * vPosition;" + " v_TexCoordinate = a_TexCoordinate;" + "}";
- 修改基础颜色的alpha值为1(完全不透明):
float color[] = {0.63671875f, 0.76953125f, 0.22265625f, 1.0f};
- draw方法中获取
aColor的位置时,改用glGetUniformLocation适配uniform变量属性:
mColorHandle = GLES20.glGetUniformLocation(mProgram, "aColor");
问题2:片段着色器混合逻辑错误
直接相加会导致颜色过曝、偏白,无法同时保留两者的原始色彩特征,改用逐分量相乘或者线性混合即可满足需求。
方案A:颜色相乘(纹理被底色染色,同时保留纹理图案和底色倾向)
修改片段着色器代码:
private final String fragmentShaderCode = "precision mediump float;" + "uniform sampler2D u_Texture;" + "uniform vec4 aColor;" + "varying vec2 v_TexCoordinate;" + "void main() {" + " vec4 texColor = texture2D(u_Texture, v_TexCoordinate);" + " gl_FragColor = texColor * aColor;" + "}";
方案B:线性混合(可手动调整两者的显示占比,灵活度更高)
private final String fragmentShaderCode = "precision mediump float;" + "uniform sampler2D u_Texture;" + "uniform vec4 aColor;" + "varying vec2 v_TexCoordinate;" + "void main() {" + " vec4 texColor = texture2D(u_Texture, v_TexCoordinate);" + // 第二个参数0.6是纹理占比,范围0-1,可根据展示效果自行调整 " gl_FragColor = mix(aColor, texColor, 0.6);" + "}";
内容的提问来源于stack exchange,提问作者Bocho
相关产品推荐
相关产品推荐

