当前位置: 首页 > 知识库问答 >
问题:

Android OpenGL-加载的纹理改变颜色

程和蔼
2023-03-14

我正在尝试渲染一个简单的3D场景。它基本上是一个包裹在纹理中的表面。我在4台设备上测试了它,只有一台(Galaxy Note 4)正确渲染了纹理。其他三款手机(HTC Evo 3D、LG G2、索尼Xperia Z1)用一种颜色渲染所有纹理,这似乎是纹理的平均颜色。例如:原始图像和渲染纹理。

我的第一个猜测是我的碎片着色器有问题。但它非常基本,是从《Android版OpenGL ES 2》一书中复制的:

private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;"+
                "attribute vec4 vPosition;"+
                "attribute vec2 a_TextureCoordinates;"+
                "varying vec2 v_TextureCoordinates;"+
                "void main()"+
                "{"+
                "v_TextureCoordinates = a_TextureCoordinates;"+
                "gl_Position = uMVPMatrix * vPosition;"+
                "}";

private final String fragmentShaderCode =
        "precision mediump float;"+
                "uniform sampler2D u_TextureUnit;"+
                "varying vec2 v_TextureCoordinates;"+
                "void main()"+
                "{"+
                "gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);"+
                "}";

加载纹理:

texCoordHandle = glGetAttribLocation(program, "a_TextureCoordinates");
texUnitHandle = glGetUniformLocation(program, "u_TextureUnit");

texHandle = new int[1];
glGenTextures(1, texHandle, 0);

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
                       R.drawable.way_texture_pink_square_512, opt);

glBindTexture(GL_TEXTURE_2D, texHandle[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);
glGenerateMipmap(GL_TEXTURE_2D);
bitmap.recycle();
glBindTexture(GL_TEXTURE_2D, 0);

我将顶点和纹理坐标保存在不同的浮动缓冲区中,并将它们绘制成循环

glUseProgram(program);
glUniformMatrix4fv(mvpMatrixHandle, 1, false, vpMatrix, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texHandle[0]);
glUniform1i(texUnitHandle, 0);
glEnableVertexAttribArray(positionHandle);
WaySection[] ws = waySects.get(currWaySect);

for( int i = 0 ; i < ws.length ; i++ ) {
    glVertexAttribPointer(
            positionHandle, COORDS_PER_VERTEX,
            GL_FLOAT, false,
            vertexStride, ws[i].vertexBuffer);

    glVertexAttribPointer(texCoordHandle, COORDS_PER_TEX_VER,
            GL_FLOAT, false,
            texStride, ws[i].texBuffer);

    glDrawArrays(GL_TRIANGLE_FAN, 0,
            ws[i].vertices.length / COORDS_PER_VERTEX);
}

glDisableVertexAttribArray(positionHandle);

我所做的:

  • 改变了纹理,尝试了不同的大小(2次方和非2次方),不同的alpha。
  • 尝试打开/关闭不同的选项,如:GL_CULL_FACE、GL_BLEND、GL_TEXTURE_MIN(MAG)_FILTER、GL_TEXTURE_WRAP...
  • 在每个可能的地方检查了OpenGL错误。glGetError()不返回错误。
  • 检查了调试器中的代码。转换为位图的纹理在加载到OpenGL之前和之后看起来都很好。

请帮忙:)

共有1个答案

桓智敏
2023-03-14

问题解决了。不稳定的行为是由于缺少GlenableVertexAttributeArray(texCoordHandle) 调用onDraw()。注4表示同意;它只需要启用位置句柄(顶点)。其他手机显然不太开心。可能是因为注释4支持GL ES 3.1?谢谢你抽出时间。

 类似资料:
  • 在Android中,我想做这样的事情(但是有两种交替的颜色:黑色和白色: 像这样用波纹效果改变颜色 我试着做的是: 1)通过XML设置默认背景色和波纹色 2)在onclick方法中,将背景色改为白色,将波纹色改为黑色 有没有办法让这个看起来像第一个?比如放慢波纹动画速度之类的?

  • 我正在尝试自学java语法,并将minecraft作为一个平台进行深入研究。但是我遇到了一个问题,因为没有加载我的纹理。就这点而言,我的本地化也是如此。这是我的代码块 这是我的课程 我的纹理保存在 根据日志,它无法找到我的纹理。这是我得到的信息 客户端加载并显示“我的项目”,但带有默认的黑色和紫色纹理。我做错了什么?我想这可能与我的命名约定有关,因为。lang文件也不会被读取,我给我的块起一个友好

  • 嘿,我不能让我的纹理出现,我不知道怎么了。辅导没有帮助。这是我的代码: spriteX=0,spriteY=0,spriteW=400,spriteL=400,x=0,y=0 这是我得到的输出:输出窗口 正如你所见,黑色三角形显示得很好,但没有纹理

  • 我一直试图让纹理在opengl 3.1下工作,在ubuntu 13.04上运行的intelHD图形2000/3000显卡上。我遇到的问题是纹理要么不加载,我试图纹理的基本三角形变成黑色,要么纹理中的一些颜色会加载,但不会加载整个图像。我使用原始图像文件作为源或使用libjpeg加载jpeg得到相同的结果。 我的着色器如下所示: 创建纹理glGenTexture(1, 还有渲染功能 几何和纹理坐标

  • 加载纹理贴图集 可以使用Pixi的loader来加载纹理贴图集。如果是用Texture Packer生成的JSON,loader会自动读取数据,并对每一个帧创建纹理。下面就是怎么用loader来加载treasureHunter.json。当它成功加载,setup方法将会执行。 loader .add("images/treasureHunter.json") .load(setup); 现

  • 我刚刚开始学习Java,同时修改Minecraft。我已经看了一个关于使用Minecraft Forge API将块添加到游戏中的教程,但是我有一个问题。不再有“.setBlockTextureName()”方法,所以我不知道该怎么做。我有一个简单的块添加到我的游戏,但它没有纹理,我想添加一个纹理到它。我该如何为Minecraft 1.8做这件事呢? 附注:如果这是一个副本,我很抱歉,我只看到关于