我的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设备的问题