【问题标题】:Android OPENGL2 not drawing texture to quadAndroid OPENGL 未将纹理绘制到四边形
【发布时间】:2018-03-17 08:23:51
【问题描述】:

我正在尝试在四边形上渲染一些纹理,但屏幕显示为空。 (开放 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);
        }

【问题讨论】:

  • 看到您在绑定 GLES20.glDeleteTextures(..) 以将纹理加载到其中之前,这有点令人困惑。
  • 有一个单独的线程加载图像并将它们绘制到位图中,因此纹理必须更改几次。 deleteTextures 调用旨在清除旧的无效纹理并将其替换为更新的纹理。 (虽然它可能不会像我认为的那样......我对 OpenGL 很陌生)
  • 我认为没有必要。一旦你从 glGenTextures 收到纹理的 ids/names(我不知道它们的确切术语),你就可以从那时起“重用”它们,只需使用 bind plus GLUUtils.texImage2D 来更新它们的内容。
  • 好的,删除线,但问题仍然存在......
  • gl_TexCoord[0].st 在您的片段着色器中看起来也很可疑,如果您没有遇到编译错误,我会有点惊讶,因为 GLSL ES 1.0 中没有这样的内置变量。我无法确定这是否有助于解决您的问题,但将其更改为 TexCoord0 也不应该造成任何伤害。

标签: android opengl-es drawing textures opengl-es-2.0


【解决方案1】:

另外还有这一行,我不确定它应该做什么;

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

我猜您的目标是不断更新 GL_TEXTURE0,在这种情况下,您应该将常量值 0 放入 muTextureHandle。或者将这一行全部删除,因为默认值为零。

【讨论】:

  • 我尝试将 muTextureHandle 替换为 0,但没有解决问题。如果我要完全删除该行,GL_TEXTURE0 将如何更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多