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

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



http://www.chinasem.cn/article/275182

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程