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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:09:00