2

当我启动该项目时,我会在预期的青色背景中呈现出一个不祥的黑色四边形。我已经确定纹理坐标正在使用片段着色器中注释掉的代码行进行正确插值。我尝试了许多不同的加载纹理的方法,并且总是得到相同的结果。加载 4 像素纹理的临时代码是从书中的示例中逐字复制的。但是,我也将其包括在内,以防万一我疏忽了。

我试图删除无礼的代码。但是,我对此仍然很陌生,并且不断学习大部分代码的全部含义。此外,许多代码都改编自不同的来源。因此,对于混乱、不一致的变量命名和冗长,我深表歉意。我确实觉得问题出在前几行。在此先感谢您的所有见解。甚至任何有关我如何进行调试的信息都将不胜感激;当在这个项目上工作时出现问题时,我感到很茫然。

画框:

public void onDrawFrame(GL10 gl) 
{

    GLES20.glClearColor(0.0f, 1.0f, 1.0f, 1.0f);

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);                    
    update();

    GLES20.glUseProgram(mProgramHandle);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureHandle);
    GLES20.glUniform1i(mTextureUniformHandle, 0);

    //For some reason I think the problem is in this area

    Matrix.setIdentityM(mModelMatrix, 0);

    quadVerts.position(mPositionOffset);
    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false, mStrideBytes, quadVerts);        
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    quadVerts.position(mColorOffset);
    GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false, mStrideBytes, quadVerts);        
    GLES20.glEnableVertexAttribArray(mColorHandle);

    GLES20.glVertexAttribPointer(mTextureCoordinateHandle, 2, GLES20.GL_FLOAT, false, 0, quadTex);        
    GLES20.glEnableVertexAttribArray(2);


    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);

    Matrix.multiplyMM(mMVPMatrix, 0, mOrthographicMatrix, 0, mMVPMatrix, 0);

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);         

    //...    
    checkGlError("on draw frame: ");
}

表面改变:

        public void onSurfaceChanged(GL10 glUnused, int width, int height) 
{
    GLES20.glViewport(0, 0, width, height);
    w = width;
    h = height;
    final float near = 1.0f;
    final float far = 10.0f;
    Matrix.orthoM(mOrthographicMatrix, 0, 0, width, 0, height, near, far);
    float[] pVertsData =
        {
            20.0f, 20.0f, 0.0f, 
            1.0f, 1.0f, 1.0f, 1.0f,

            (float) width- 20.0f, 20.0f, 0.0f, 
            1.0f, 1.0f, 1.0f, 1.0f,

            (float) width - 20.0f, (float) height - 20.0f, 0.0f, 
            1.0f, 1.0f, 1.0f, 1.0f,

            20.0f, (float) height - 20.0f, 0.0f,
            1.0f, 1.0f, 1.0f, 1.0f
        };

    quadVerts = ByteBuffer.allocateDirect(pVertsData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();

    quadVerts.put(pVertsData).position(0);

    float texture[] = 
        {
            0.0f, 0.0f,
            1.0f, 0.0f,
            1.0f, 1.0f,
            0.0f, 1.0f
        };
    quadTex = ByteBuffer.allocateDirect(texture.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
    quadTex.put(texture).position(0);

checkGlError("surface changed: ");
}

表面创建:

public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
{
    mParticleSystem = new ParticleSystem();
     //GLES20.glEnable(GLES20.GL_TEXTURE_2D);
     if (mTextureHandle != 1)
    mTextureHandle = loadGLTexture(activeContext, resourceID);
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    final float eyeX = 0.0f;
    final float eyeY = 0.0f;
    final float eyeZ = 1.5f;

    final float lookX = 0.0f;
    final float lookY = 0.0f;
    final float lookZ = -5.0f;

    final float upX = 0.0f;
    final float upY = 1.0f;
    final float upZ = 0.0f;

    Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);

    final String vertexShader = 
            "uniform mat4 u_MVPMatrix;              \n"

        +   "attribute vec4 a_Position;             \n"
        +   "attribute vec4 a_Color;                \n"
        +   "attribute vec2 a_TexCoordinate;        \n"

        +   "//varying vec3 v_Position;             \n"
        +   "varying vec4 v_Color;                  \n"
        +   "varying vec2 v_TexCoordinate;          \n"

        +   "void main()                            \n"
        +   "{                                      \n"
        +   "   v_TexCoordinate = a_TexCoordinate;  \n"
        +   "   v_Color = a_Color;                  \n"
        +   "   gl_Position = u_MVPMatrix           \n"
        +   "               * a_Position;           \n"
        +   "}                                      \n";

    final String fragmentShader =
            "precision mediump float;       \n"

        +   "uniform sampler2D u_Texture;   \n" 
        +   "varying vec4 v_Color;          \n"
        +   "varying vec2 v_TexCoordinate;  \n"
        +   "void main()                    \n"
        +   "{                              \n" 
        +   "   vec4 baseColor;"
        +   "   baseColor = texture2D(u_Texture, v_TexCoordinate);      \n"
        +   "    " 
        +   "   gl_FragColor = baseColor;   \n" 
        +   "                           \n"
        +   "   //gl_FragColor = vec4(v_TexCoordinate.x, v_TexCoordinate.y, 0.0, 1.0);  \n"
        +   "   //gl_FragColor = v_Color;       \n"

        +   "}                              \n";

    //... Compile Shaders


    int programHandle = GLES20.glCreateProgram();
    if (programHandle != 0) 
    {
        GLES20.glAttachShader(programHandle, vertexShaderHandle);           
        GLES20.glAttachShader(programHandle, fragmentShaderHandle);
        GLES20.glBindAttribLocation(programHandle, 0, "a_Position");
        GLES20.glBindAttribLocation(programHandle, 1, "a_Color");
        GLES20.glBindAttribLocation(programHandle, 2, "a_TexCoordinate");
        GLES20.glLinkProgram(programHandle);
        final int[] linkStatus = new int[1];
        GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, linkStatus, 0);
        if (linkStatus[0] == 0) 
        {               
            GLES20.glDeleteProgram(programHandle);
            programHandle = 0;
        }
    }

    if (programHandle == 0)
    {
        throw new RuntimeException("Error creating program.");
    }
    mMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");        
    mPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position");
    mColorHandle = GLES20.glGetAttribLocation(programHandle, "a_Color");
    mTextureUniformHandle = GLES20.glGetUniformLocation(programHandle, "u_Texture");
    mTextureCoordinateHandle = GLES20.glGetAttribLocation(programHandle, "a_TexCoordinate");

    //GLES20.glUseProgram(programHandle);  
    mProgramHandle = programHandle;
checkGlError("surface created: ");
    }

加载纹理:

private int loadGLTexture(Context context, final int resourceId)
{


    final int[] textureHandle = new int[1];
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);
        GLES20.glGenTextures(1, textureHandle, 0);

        byte[] pixels = 
            {  
                (byte) 0xff,   0,   0, 
                0, (byte) 0xff,   0, 
                0,   0, (byte) 0xff,
                (byte) 0xff, (byte) 0xff,   0
            };

        ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(4*3);
        pixelBuffer.put(pixels).position(0);
        GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, textureHandle[0] );
        GLES20.glTexImage2D ( GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, 2, 2, 0, GLES20.GL_RGB, GLES20.GL_UNSIGNED_BYTE, pixelBuffer );
        GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST );
        GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST );
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);


    }
    if (textureHandle[0] == 0)
    {
        throw new RuntimeException("Error loading texture.");
    }
    checkGlError("create texture: ");
    return textureHandle[0];
}

代码更新如下所示。

4

2 回答 2

2

最后,定位问题。为了简单起见,我在发布的代码中删除了很多注释掉的行。其中之一是片段着色器中直接位于“gl_FragColor = baseColor;”之前的行。然而这条线没有'\n'......所以实际上我已经注释掉了应该实际将纹理放在四边形上的线。因此,上面的代码实际上会正常运行,而我项目中的代码则不会。

于 2012-07-05T13:42:13.990 回答
1

夫妇的想法。我不知道你的问题是否在这里,但这里是:

  1. 您没有使用 glGetError 进行任何错误检查(您应该这样做)。它会帮助你发现很多问题。

  2. GLES20.glEnable(GLES20.GL_TEXTURE_2D);在 GLES2.0 中不是合法调用。启用 GL_TEXTURE_2D 只会影响已弃用的固定功能管道。这可能会产生错误,但不应导致您的问题。

您可以尝试添加错误检查,并在有任何问题时报告吗?我扫描了你的代码,但到目前为止它看起来很正确。

于 2012-07-04T21:46:59.280 回答