【我的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

相关文章

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3