纹理仅显示为黑色

时间:2012-08-09 13:08:19

标签: android opengl-es opengl-es-2.0 textures

注意:我现在已将此代码更新为工作表单,并提供了我在答案中尝试的所有内容。希望它可以帮助其他人解决同样的问题。

我的纹理显示为黑色(即没有纹理)。我在这里遇到了同样问题的其他几个问题,但找不到解决方案。我确定我错过了一些非常简单的事情(可能是订购),但无法弄明白。

我设置了这样的纹理(GLProgram.checkError检查GL错误并记录它们 - 我在任何地方都没有错误):

    /*Bitmap*/ bitmap = BitmapFactory.decodeResource( context.getResources(), 
        R.drawable.gears );

    int textures[] = new int[1];
    GLES20.glGenTextures( 1, textures, 0 );
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
    GLProgram.checkError( "texImage2D" );

    texture = textures[0];

要绘制一个应该纹理的正方形,我这样做:

    GLES20.glVertexAttribPointer(glProgram.hATex, 2, GLES20.GL_FLOAT, false, 
        2*SIZEOF_FLOAT, texBuffer.under);
    GLProgram.checkError( "hATex" );

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0 );
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
    GLES20.glUniform1i(glProgram.hUTex, 0);
    GLProgram.checkError( "Uniform" );

    GLES20.glVertexAttribPointer( glProgram.hAttribPosition, COORDS_PER_VERTEX,
        GLES20.GL_FLOAT, false,
        vertexStride, vertexBuffer.under );
    GLProgram.checkError( "Vertex" );
    GLES20.glDrawArrays( GLES20.GL_TRIANGLE_FAN, 0, vertexBuffer.size/COORDS_PER_VERTEX );
    GLProgram.checkError( "draw" );

我的顶点着色器是:

precision mediump float;
attribute vec4 vPosition;
uniform mat4 mTransform;

attribute vec2 aTex;
varying mediump vec2 vTex;

void main() {
  gl_Position = mTransform * vPosition;
  vTex = aTex;
}

我的片段着色器是:

precision mediump float;
uniform vec4 vColor;
uniform sampler2D uTex;
varying mediump vec2 vTex;

void main(void)
{
//gl_FragColor = vColor;
//testing vTex, and it is fine
//gl_FragColor = vec4( vTex[0], vTex[1], 0, 1.0 );
//so it must be uTex which is program
    gl_FragColor = texture2D(uTex,vTex);
}

我留下了评论位,以显示我检查的内容。我的vTex参数是正确的,因为该位产生预期的红色/绿色扫描。所以我认为它必须是纹理本身。

此外,uTex,aTex位于:

    hATex = GLES20.glGetAttribLocation( hProgram, "aTex" );
    checkError( "aTex" );
    hUTex = GLES20.glGetUniformLocation( hProgram, "uTex" );
    checkError( "uTex" );

我的纹理是JPG,尺寸为64x64。我在加载后检查它并且它具有正确的大小并且看起来具有像素颜色(随机倾倒一些非零)。

1 个答案:

答案 0 :(得分:2)

现在,代码正常运行。当我尝试的东西和评论时,我修改了它。我无法确定它实际开始工作的哪一步,因为它之前没有用。以下是我在这个过程中检查/仔细检查过的一些事情 - 我认为它必须是这些的组合:

  1. 验证源图像是方形的,大小为2的幂
    • 非正方形只要两个维度的幂为2
    • 只要TEXTURE_WRAP设置为CLAMP_TO_EDGE ,
    • 非电源2就可以正常工作
  2. 将Min / Mag设置为最接近的
  3. 在设置和每次抽奖期间调用bindTexture
  4. 这些是我尝试过的东西,现在再次尝试,似乎没有什么不同(也就是说,无论哪种方式都有效):

    1. 使用位图options.inScaled = false(使用默认选项正常)
    2. 在glTexParameter函数之前/之后放置texImage2d
    3. 从vTex添加/删除mediump(不匹配的工作正常,可能是因为默认)
    4. 没有调用glEnableVertexAttribArray(这导致一个白框,所以这不是我的问题)
    5. 改变顶点和纹理坐标的顺序(一旦其他东西正确,所有订单都可以工作 - 纹理可能会偏斜,但确实会出现)
    6. 更改资源格式(JPG / PNG)(RGB /灰度)
    7. 更改对象变换矩阵
    8. TEXTURE_WRAP设置(在这种情况下不需要,无需工作)
    9. 如果它不工作,则错误是静默的:对glGetError的调用返回正常,glGetProgramInfoLog为空。