2010-12-03 14 views
4

Ich versuche, ein einfaches strukturiertes Quad in OpenGL ES 2.0 auf einem iPhone zu rendern. Die Geometrie ist in Ordnung und ich bekomme die erwartete Quad, wenn ich eine feste Farbe in meinem Shader:OpenGL ES 2.0 Texturierung

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

Und ich bekomme die erwarteten Gradienten, wenn ich die Textur machen Koordinaten direkt:

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

Das Bild Daten werden von einem UIImage geladen wird, innerhalb von 1024x1024 zu passen skaliert und in eine Textur geladen etwa so:

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

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

width, height, und um den Inhalt von data sind alle korrekt, wie im Debugger untersucht.

Wenn ich meine Fragment-Shader ändern, um die Textur zu verwenden:

 
    gl_FragColor = texture2D (tex, texCoord); 

... und binden die Textur und machen etwa so:

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

... ich nichts. Ein schwarzes Viereck. glGetError() gibt keinen Fehler zurück und glIsTexture(_texture) gibt True zurück.

Was mache ich hier falsch? Ich bin immer und immer wieder über jedes Beispiel gestolpert, das ich online finden konnte, aber jeder tut es genau so, wie ich bin, und der Debugger zeigt meine Parameter den verschiedenen GL-Funktionen an, was ich von ihnen erwarte.

+0

Genau wie Sie, kann ich nicht offensichtlich etwas falsch mit dem Code angezeigt sehen. Wenn Sie wollen, können Sie das ganze Projekt irgendwo posten? Es muss wirklich sehr interessant sein. – Tommy

+0

Ich möchte nicht das gesamte Projekt veröffentlichen, aber der OpenGL-Code befindet sich in einer eigenständigen UIView-Unterklasse: – Xtapolapocetl

+0

http://dl.dropbox.com/u/163839/FilteredImageView/FilteredImageView.h – Xtapolapocetl

Antwort

1

Stellen Sie nach glTexImage2D die MIN/MAG-Filter mit glTexParameter ein, die Standardwerte verwenden Mipmaps, sodass die Textur mit diesem Code unvollständig ist.

+0

Ich mache das schon (und ich habe sowohl vor als auch nach glTexImage2D versucht). Kein Glück. – Xtapolapocetl

1

Ich hatte das gleiche Problem (schwarzer Quad) und konnte keine Antwort finden, bis eine Antwort von jfcalvo von this question mich zur Ursache geführt hat. Stellen Sie sicher, dass Sie die Textur nicht in einem anderen Thread laden.

0

stellen Sie sicher, dass Sie (glTexImage2D) mit richtigen Formaten (Konstanten)

stellen Sie sicher, fordern, dass Sie Ressourcen Bildes zu befreien, nachdem glTexImage2D

, das ist, wie ich es auf Android zu tun bin:

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

Stellen Sie sicher, dass Sie die Texturumbruchparameter auf GL_CLAMP_TO_EDGE sowohl in S- als auch in T-Richtung festlegen. Ohne diese ist die Textur unvollständig und erscheint schwarz.

0

vielleicht vergessen zu

glEnable (GL_TEXTURE_2D);

ist solch ein Fall, Textur2D im Shader würde schwarz zurückkehren, wie das OP zu leiden scheint.