Android OpenGL2.0 zeigt schwarze Texturen

Ich versuche zum zeichnen von Texturen auf quads in OpenGL2.0. Bisher hab ich die quads zu zeigen, und alles, aber die Texturen sind nicht da - die quads sind alle schwarz.

Mein main Verdacht ist, dass ich nicht das mapping der Texturen korrekt - meine Texturen sind keine Potenz von 2 ist, noch sind Sie Platz - Ihre Breite ist im Bereich mWidth und deren Höhe in mRowHeight.

Des quads gezogen werden, die in einer vertikalen Liste, die ist fertig mit übersetzen matrix.

Werde ich sehr dankbar sein, wenn jemand gehen über diese Ursache ich bin verzweifelt!

Hier der zugehörige code:

Initialisierung der Puffer:

    void initBuffers() {
        float r = (float) mRowHeight / (mHeight / 2f);
        ByteBuffer bb;

        float[] bounds = { //X Y Z
        /* 0 - TL */-1f, 1f,    0f, 
        /* 1 - BL */-1f, 1 - r, 0f, 
        /* 2 - BR */ 1f, 1 - r, 0f,
        /* 3 - TR */ 1f, 1f,    0f };
        bb = ByteBuffer.allocateDirect(bounds.length * 4);
        bb.order(ByteOrder.nativeOrder());
        mVertBuffer = bb.asFloatBuffer();
        mVertBuffer.put(bounds).position(0);

        short[] indices = { 0, 1, 2, 0, 2, 3 };
        bb = ByteBuffer.allocateDirect(indices.length * 2);
        bb.order(ByteOrder.nativeOrder());
        mIndBuffer = bb.asShortBuffer();
        mIndBuffer.put(indices).position(0);

        float[] texture = { 
                /* 0 - BL */-1f, 1f, 
                /* 1 - TL */-1f, 1 - r, 
                /* 2 - BR */1f, 1 - r, 
                /* 3 - TR */1f, 1f };
        bb = ByteBuffer.allocateDirect(texture.length * 4);
        bb.order(ByteOrder.nativeOrder());
        mTexBuffer = bb.asFloatBuffer();
        mTexBuffer.put(texture).position(0);

    }

Zeichnung des Rahmens:

    @Override
    public void drawFrame() {
        long startTime = System.currentTimeMillis();
        if (!mLayoutComplete) {
            return;
        }
        final float halfw = mHeight / 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.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT,
                false, 0, mVertBuffer);
        GLES20.glEnableVertexAttribArray(maPositionHandle);

        final int l = mLastRow;
        for (; i <= l; i++) {

            ThumbRow thr = mCache.get(i);
            if (thr != null) {
                GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
                if (thr.mDirty) {
                    thr.loadTexture(null, null);
                    thr.mDirty = false;
                } else {
                    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, thr.mRow + 1);
                }
                GLES20.glUniform1i(msTextureHandle, 0);

                GLES20.glVertexAttribPointer(maTextureHandle, 2,
                        GLES20.GL_FLOAT, false, 0, mTexBuffer);
                GLES20.glEnableVertexAttribArray(maTextureHandle);

                GLES20.glUniformMatrix4fv(muTMatrixHandle, 1, false,
                        mTMatrix, 0);
                GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6,
                        GLES20.GL_UNSIGNED_SHORT, mIndBuffer);
                Log.i(TAG, GLES20.glGetProgramInfoLog(mProgram));
            }

            Matrix.translateM(mTMatrix, 0, 0, -r, 0); //Shift drawing
                                                        //window to next
                                                        //row.
        }

        GLES20.glDisableVertexAttribArray(maPositionHandle);
        GLES20.glDisableVertexAttribArray(maTextureHandle);

        Log.d(TAG, "onDrawFrame(): "
                + (System.currentTimeMillis() - startTime));
    }

Laden der Texturen:

        public void loadTexture(GL10 gl, Context c) {
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mRow + 1);

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

Vertex-Shader:

uniform mat4 uTMatrix;
uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
attribute vec2 aTextureCoord;
varying vec2 vTextureCoord;

void main() {
    gl_Position = uMVPMatrix * uTMatrix * aPosition;
    vTextureCoord = aTextureCoord;
}

Fragment-Shader:

precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D sTexture;
void main() {
    gl_FragColor = texture2D(sTexture, vTextureCoord);
}

Jede Hilfe wird sehr geschätzt.

  • Einmal ruft glBindTexture(..) was mRow + 1 zum Beispiel? Wenn es eine interne variable, Sie sollten es ändern, um die textur-Namen erhalten Sie von glGenTextures(..). Und grundsätzlich, wenn Sie mit einer textur, die nur (und aktualisieren Sie Ihre Inhalte nur dann), verwenden, die eine textur-Namen zu allen Zeiten.
  • mRow ist der index der aktuellen quad gezogen wird - die textur der quad ist bestimmt von seiner mRow. EDIT: Von dem, was ich verstanden, es ist okay, um meine eigene textur-Namen, solange Sie eindeutig sind und ich Sie erinnern
  • NÖ. Sie haben zu reservieren, textur-Namen mit glGenTextures(..), Sie kann nicht einfach kommen mit eigenen. In Ihrem Fall sollten Sie reservieren, ROW_COUNT textur Namen und verwenden glBindTexture(.., TEXTURE_NAMES[mRowIdx]). Aber wenn ROW_COUNT sehr hoch ist, könnte es am besten, um neu zu laden bitmap in eine textur nur für jede Zeile, zur Vermeidung unnötiger Speicherverbrauch.
  • Hmm.. Jetzt nach re-Lektüre, khronos.org/opengles/sdk/docs/man ich bin mir nicht sicher, ob glGenTextures ist Pflicht, nachdem alle. Sollte nicht Schaden, es trotzdem zu benutzen.
  • Ich habe versucht, Ihr eine textur-Methode, aber immer noch dasselbe problem... ich glaube das problem ist das die shader param TexCoord nicht richtig zugeordnet, oder das textur-mapping. (oder beide)
  • Hmm.. Sind Sie den Aufruf glUseProgram(..) irgendwo vor der Eingabe streckwerk() -Methode? Auch, während ich bin nicht sicher, ob dies hat keine Wirkung, ich bin zum call Puffer.position(0) bevor Sie Sie glVertexAttribPointer(..).
  • Ja, glUseProgram aufgerufen wird. Hinzufügen .position(0)'s nicht, das problem zu lösen...

InformationsquelleAutor saarraz1 | 2011-12-31
Schreibe einen Kommentar