本文主要是介绍【我的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 eslayout(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,// Mallets0.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. 导致黑屏的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!