2

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

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

我像这样设置我的纹理(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。我在加载后检查了一下,它的大小正确,并且确实具有像素颜色(随机倾倒一些非零)。

4

1 回答 1

2

所呈现的代码现在可以工作了。我在尝试和评论时修改了它。我不能确定它实际上是从哪一步开始工作的,因为它以前没有工作过。以下是我在此过程中检查/仔细检查的一些事情——我认为它必须以某种方式结合起来:

  1. 验证源图像是否为正方形且大小为 2 的幂
    • 非正方形的作品,只要在两个维度上都是 2 的幂
    • 只要 TEXTURE_WRAP 设置为 CLAMP_TO_EDGE,non-power 2 就可以工作
  2. 将 Min/Mag 设置为最近的
  3. 在设置期间和每次绘制中调用 bindTexture

这些是我尝试过的东西,现在又试了一次,似乎没有什么不同(也就是说,它可以用任何一种方式):

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

在它不工作的情况下,错误是沉默的:对 glGetError 的调用返回正常并且 glGetProgramInfoLog 是空的。

于 2012-08-09T15:28:23.883 回答