2010-12-03 328 views
4

我正試圖在iPhone上渲染OpenGL ES 2.0中的簡單紋理四邊形。幾何形狀是很好,我得到預期的四,如果我在着色器使用純色:OpenGL ES 2.0紋理

 
    gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0); 

我得到預期的梯度,如果我使紋理直接座標:

 
    gl_FragColor = vec4 (texCoord.x, texCoord.y, 0.0, 1.0); 

圖像數據從一個UIImage,縮放裝載到裝配在1024×1024,並裝入紋理像這樣:

 
    glGenTextures (1, &_texture); 
    glBindTexture (GL_TEXTURE_2D, _texture); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, 
     GL_UNSIGNED_BYTE, data); 

widthheight,將其內容data都是正確的,正如調試器中所檢查的那樣。

當我改變我的片段着色器使用質地:

 
    gl_FragColor = texture2D (tex, texCoord); 

...並綁定紋理和渲染,像這樣:

 
    glActiveTexture (GL_TEXTURE0); 
    glBindTexture (GL_TEXTURE_2D, _texture); 

    // this is unnecessary, as it defaults to 0, but for completeness... 
    GLuint texLoc = glGetUniformLocation(_program, "tex");   
    glUniform1i(texLoc, 0); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

...我什麼也沒得到。黑色的四邊形。 glGetError()不返回錯誤,glIsTexture(_texture)返回true。

我在這裏做錯了什麼?我已經反覆了我可以在網上找到的每一個例子,但是每個人都像我一樣完成它,調試器顯示我對各種GL功能的參數是我期望的。

+0

和你一樣,我無法看到任何明顯的錯誤所呈現的代碼。如果你願意,你可以將整個項目發佈在某個地方嗎?有一些非常有趣的事情發生。 – Tommy 2010-12-03 17:56:39

+0

我不想發佈整個項目,但OpenGL的代碼是一個自包含的UIView子類: – Xtapolapocetl 2010-12-03 18:04:16

回答

1

後glTexImage2D,設定glTexParameter的MIN/MAG過濾器,默認值使用的mipmap所以紋理是不完整的與該代碼。

1

我遇到同樣的問題(黑四),並不能找到答案,直到被this question jfcalvo的迴應使我的事業。基本上確保你沒有在不同的線程中加載紋理。

0

確保您所呼叫(glTexImage2D)用正確的格式(常量)

之後確保你釋放圖像資源glTexImage2D

那怎麼我正在做它的android:

int[] textures = new int[1]; 
      GLES20.glGenTextures(1, textures, 0); 

      mTextureID = textures[0]; 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID); 

      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); 

      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
        GLES20.GL_REPEAT); 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
        GLES20.GL_REPEAT); 

      InputStream is = mContext.getResources() 
       .openRawResource(R.drawable.ywemmo2); 
      Bitmap bitmap; 
      try { 
       bitmap = BitmapFactory.decodeStream(is); 
      } finally { 
       try { 
        is.close(); 
       } catch(IOException e) { 
        // Ignore. 
       } 
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 
1

確保您設置紋理包裝參數在這兩個S和T方向GL_CLAMP_TO_EDGE。如果沒有這個,紋理是不完整的,並會顯示黑色。

0

也許你忘了

glEnable(GL_TEXTURE_2D);

是這樣的情況下,在的Texture2D着色器將返回黑,作爲OP似乎受到影響。