2011-12-30 81 views
0

我试图获得一些纹理在四边形上呈现,但屏幕变为空。 (Open GL 2.0) 我之前在四边形上使用了静态颜色着色器,并且四边形确实出现在屏幕上,所以定位很好。Android OPENGL2没有绘制纹理到四边形

更新:现在我可以看到黑色的纹理只有...

这里是我的代码:

顶点着色器:

uniform mat4 uTMatrix; 
uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 
attribute vec4 vTex; 
attribute vec4 inputTextureCoordinate; 
varying vec2 TexCoord0; 
void main(){ 
    TexCoord0 = inputTextureCoordinate.xy; 
    gl_Position = uMVPMatrix * uTMatrix * vPosition; 
} 

破片着色器:

varying highp vec2 TexCoord0; 
uniform sampler2D colorMap; 
void main(){ 
    gl_FragColor = texture2D(colorMap, TexCoord0); 
} 

onDrawFrame ():

  Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

      GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); 

      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 

      GLES20.glUseProgram(mProgram); 

     final float halfw = mWidth/2f; 
     final int rowHeight = mRowHeight; 
     final float r = (float) rowHeight/halfw; 

     int i = mFirstRow; 

     final float initial = (float) ((i * rowHeight) - mScroll)/halfw; 

     Matrix.setIdentityM(mTMatrix, 0); 
     Matrix.translateM(mTMatrix, 0, 0, -initial, 0); 

     GLES20.glFrontFace(GLES20.GL_CW); 

     GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, 
       false, 0, mVertBuffer); 
     GLES20.glEnableVertexAttribArray(maPositionHandle); 

     GLES20.glVertexAttribPointer(maTexHandle, 3, GLES20.GL_FLOAT, 
       false, 0, mTexBuffer); 
     GLES20.glEnableVertexAttribArray(maTexHandle); 

     GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
     GLES20.glEnable(GLES20.GL_TEXTURE_2D); 

     final int l = mLastRow; 
     for (; i <= l; i++) { 
      if (\*A check to see if the bitmap is cached*\) { 
       GLES20.glUniform1i(muTextureHandle, i); 
       GLES20.glUniformMatrix4fv(muTMatrixHandle, 1, false, 
         mTMatrix, 0); 
       GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
      } 

      Matrix.translateM(mTMatrix, 0, 0, -r, 0); 
     } 

     GLES20.glDisableVertexAttribArray(maPositionHandle); 
     GLES20.glDisableVertexAttribArray(maTexHandle); 

loadTexture:

 public void loadTexture(GL10 gl, Context c) { 
      int[] texture = new int[1]; 
      texture[0] = mRow; 
      GLES20.glDeleteTextures(1, texture, 0); 
      texture[0] = mRow; 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[0]); 

      // Create Nearest Filtered Texture 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
        GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
        GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 

      // Different possible texture parameters, e.g. 
      // GLES20.GL_CLAMP_TO_EDGE 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
        GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
        GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 

      Bitmap bitmap = mBitmap; 
      if (bitmap == null) { 
       bitmap = mEmptyBitmap; 
      } 
      GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
     } 
+0

看到您在将纹理加载到GLES20.glDeleteTextures(..)之前调用GLES20.glDeleteTextures(..)有点令人困惑。 – harism 2011-12-30 21:44:35

+0

有一个单独的线程可以加载图像并将其绘制到位图中,因此纹理必须更改几次。 deleteTextures调用旨在清除旧的无效纹理,并将其替换为更新的纹理。 (虽然它可能不会做我认为的...我对OpenGL非常陌生) – saarraz1 2011-12-30 21:49:37

+1

我认为这不是必需的。一旦你收到来自glGenTextures的纹理的ID /名称(我不知道它们的确切名词),你可以从中重新使用它们,并简单地使用bind和GLUUtils.texImage2D来更新它们的内容。 – harism 2011-12-30 21:52:59

回答

0

此外还有这一行,我不知道它应该做的;

if (\*A check to see if the bitmap is cached*\) { 
    GLES20.glUniform1i(muTextureHandle, i); // ?? 
    ... 
} 

我猜你的目标是更新GL_TEXTURE0不断,虽然,在这种情况下,你应该把恒定值0muTextureHandle。或者将这一行全部删除,因为零是默认值。

+0

我试图用0替换muTextureHandle,但没有解决问题。如果我完全删除该行,那么GL_TEXTURE0将如何更新? – saarraz1 2011-12-30 22:29:52