Android OPENGL2 не рисует текстуру в quad

Я пытаюсь отрендерить некоторые текстуры на квадрациклах, но экран оказывается пустым. (Open GL 2.0) Раньше я использовал статический цветовой шейдер для четырехугольников, и четырехугольники действительно появлялись на экране, поэтому позиционирование в порядке.

ОБНОВЛЕНИЕ: Теперь я вижу только черные текстуры...

Вот мой код:

Вершинный шейдер:

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

загрузитьтекстуру:

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

person saarraz1    schedule 30.12.2011    source источник
comment
Немного сбивает с толку то, что вы вызываете GLES20.glDeleteTextures(..) непосредственно перед тем, как привязать его для загрузки в него текстуры.   -  person harism    schedule 31.12.2011
comment
Существует отдельный поток, который загружает изображения и рисует их в растровое изображение, поэтому текстуру придется менять несколько раз. вызов deleteTextures предназначен для очистки старой недопустимой текстуры и замены ее обновленной. (Хотя это может не делать то, что я думаю... Я очень новичок в OpenGL)   -  person saarraz1    schedule 31.12.2011
comment
Я думаю, что это не нужно. После того, как вы получили идентификаторы/имена (я не знаю точного термина для них) для текстур из glGenTextures, вы можете «повторно использовать» их с этого момента и просто использовать bind плюс GLUUtils.texImage2D для обновления их содержимого.   -  person harism    schedule 31.12.2011
comment
Хорошо, удалил строку, но проблема осталась...   -  person saarraz1    schedule 31.12.2011
comment
gl_TexCoord[0].st выглядит довольно подозрительно и в вашем фрагментном шейдере, и я немного удивлен, если вы не столкнулись с ошибками компиляции, поскольку в GLSL ES 1.0 такой встроенной переменной нет. Я не могу точно сказать, поможет ли это решить вашу проблему, но изменение его на TexCoord0 тоже не должно причинить вреда.   -  person harism    schedule 31.12.2011
comment
Спасибо, что указали на это, теперь есть изменения - я вижу только черные текстуры.   -  person saarraz1    schedule 31.12.2011


Ответы (1)


Кроме того, есть одна строка, я не уверен, что она должна делать;

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

Я предполагаю, что ваша цель - постоянно обновлять GL_TEXTURE0, и в этом случае вы должны поместить постоянное значение 0 в muTextureHandle. Или удалите эту строку целиком, так как по умолчанию используется ноль.

person harism    schedule 30.12.2011
comment
Я попытался заменить muTextureHandle на 0, но проблема не исчезла. Если бы я вообще удалил строку, как бы обновился GL_TEXTURE0? - person saarraz1; 31.12.2011