一、问题描述

今天写一个简单的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);

重新编译,正常显示了绘制的内容,如下所示:
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐