我的OpenGL学习进阶之旅解决OpenGL调用glVertexAttribPointer出错:a vertex attribute array is uninitialized. 导致黑屏的问题

Posted 字节卷动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的OpenGL学习进阶之旅解决OpenGL调用glVertexAttribPointer出错:a vertex attribute array is uninitialized. 导致黑屏的问题相关的知识,希望对你有一定的参考价值。

一、问题描述

今天写一个简单的Opengl ES的案例的时候,因为失误,导致黑屏。没有任何画面渲染出来,如下所示:

查看日志,发现有如下错误日志提示:

2021-12-31 09:56:12.894 17272-17319/com.oyp.openglesdemo E/emuglGLESv2_enc: a vertex attribute array is uninitialized. Skipping corresponding vertex attribute.
2021-12-31 09:56:12.894 17272-17319/com.oyp.openglesdemo I/chatty: uid=10116(com.oyp.openglesdemo) GLThread 1818 identical 2 lines
2021-12-31 09:56:12.894 17272-17319/com.oyp.openglesdemo E/emuglGLESv2_enc: a vertex attribute array is uninitialized. Skipping corresponding vertex attribute.

二、分析错误

错误日志,关键点是:

a vertex attribute array is uninitialized. Skipping corresponding vertex attribute.

翻译过来就是:

顶点属性数组未初始化。跳过相应的顶点属性。

那么我们就得去分析分析代码了。

2.1 顶点着色器代码

顶点着色器代码如下:

  • vertex/vertex_shader_air_hockey.glsl
#version 300 es

layout(location = 0) in vec4 a_Position;
layout(location = 1) in vec4 a_Color;

out vec4 v_Color;

void main()

    v_Color = a_Color;

    gl_Position = a_Position;
    gl_PointSize = 10.0;

二、程序为顶点属性初始化

我们定义了几个常量,如下:


#define VERTEX_POS_INDX       0
#define VERTEX_COLOR_INDX     1

#define VERTEX_POS_SIZE       2 // x, y
#define VERTEX_COLOR_SIZE     3 // r, g, b

定义了一个数组,如下:

// 10 vertices, with (x,y,z) ,(r, g, b, a)  per-vertex
static GLfloat tableVerticesWithTriangles[ 10 * (VERTEX_POS_SIZE + VERTEX_COLOR_SIZE)] = 
        // Order of coordinates: X, Y, R, G, B

        // Triangle Fan 三角形扇  其实绘制了4个三角形
        // 123,134,145,152
        // 第1个顶点:以中心顶点作为起始点
        0.0f, 0.0f,     1.0f, 1.0f, 1.0f,
        // 第2个顶点
        -0.5f, -0.5f,   0.7f, 0.7f, 0.7f,
        // 第3个顶点
        0.5f, -0.5f,    0.7f, 0.7f, 0.7f,
        // 第4个顶点
        0.5f, 0.5f,     0.7f, 0.7f, 0.7f,
        // 第5个顶点
        -0.5f, 0.5f,    0.7f, 0.7f, 0.7f,
        // 重复第2个点
        -0.5f, -0.5f,   0.7f, 0.7f, 0.7f,

        // Line 1
        -0.5f, 0.0f,    1.0f, 0.0f, 0.0f,
        0.5f, 0.0f,     1.0f, 0.0f, 0.0f,

        // Mallets
        0.0f, -0.25f,   0.0f, 0.0f, 1.0f,
        0.0f, 0.25f,    1.0f, 0.0f, 0.0f
;

初始化顶点属性的有问题的代码:

    GLint vtxStride = sizeof(GLfloat) * (VERTEX_POS_SIZE + VERTEX_COLOR_SIZE);

    GLfloat *vtxBuf = tableVerticesWithTriangles;
    glVertexAttribPointer(VERTEX_POS_INDX, VERTEX_POS_SIZE,
                          GL_FLOAT, GL_FALSE,
                          vtxStride,vtxBuf);

    vtxBuf += VERTEX_POS_SIZE;
    glVertexAttribPointer(VERTEX_POS_INDX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE,
                          vtxStride,vtxBuf);

    glEnableVertexAttribArray(VERTEX_POS_INDX);
    glEnableVertexAttribArray(VERTEX_COLOR_INDX);

实际上我们想要的效果如下所示:

    glUseProgram(m_ProgramObj);

    GLint vtxStride = sizeof(GLfloat) * (2 + 3);

    GLfloat *vtxBuf = tableVerticesWithTriangles;
    glVertexAttribPointer(0, 2,
                          GL_FLOAT, GL_FALSE,
                          vtxStride,vtxBuf);

    vtxBuf += 2;
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,
                          vtxStride,vtxBuf);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);


而我们错误的代码没有初始化1,初始化了2次0,所以导致错误了!

三、修复错误

我们将错误初始化了两次的VERTEX_POS_INDX中第二次的改成VERTEX_COLOR_INDX即可。

    GLint vtxStride = sizeof(GLfloat) * (VERTEX_POS_SIZE + VERTEX_COLOR_SIZE);

    GLfloat *vtxBuf = tableVerticesWithTriangles;

    glVertexAttribPointer(VERTEX_POS_INDX, VERTEX_POS_SIZE,
                          GL_FLOAT, GL_FALSE,
                          vtxStride,vtxBuf);

    vtxBuf += VERTEX_POS_SIZE;
    glVertexAttribPointer(VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE,
                          vtxStride,vtxBuf);

    glEnableVertexAttribArray(VERTEX_POS_INDX);
    glEnableVertexAttribArray(VERTEX_COLOR_INDX);

重新编译,正常显示了绘制的内容,如下所示:

以上是关于我的OpenGL学习进阶之旅解决OpenGL调用glVertexAttribPointer出错:a vertex attribute array is uninitialized. 导致黑屏的问题的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅解决OpenGL调用glVertexAttribPointer出错:a vertex attribute array is uninitialized. 导致黑屏的问题

我的OpenGL学习进阶之旅解决OpenGL调用glVertexAttribPointer出错:a vertex attribute array is uninitialized. 导致黑屏的问题

我的OpenGL学习进阶之旅解决关于在OpenGL ES开发中GLSurfaceView调用了onPause和onResume方法,然后息屏亮屏之后GLSurfaceView黑屏的问题

我的OpenGL学习进阶之旅解决关于在OpenGL ES开发中GLSurfaceView调用了onPause和onResume方法,然后息屏亮屏之后GLSurfaceView黑屏的问题

我的OpenGL学习进阶之旅解决Android OpenGL ES 调试工具 GAPID 无法识别Android设备的问题

我的OpenGL学习进阶之旅解决Android OpenGL ES 调试工具 GAPID 无法识别Android设备的问题