OPENGL学习笔记之glEnableVertexAttribArray函数

OPENGL学习笔记之glEnableVertexAttribArray函数

2017/10/18

写代码画三角形的时候发现总是无法输出顶点的数据,查阅文档之后发现是因为不小心注释掉了glEnableVertexAttribArray(0);的问题,所以查阅相关资料如下:

本文档讨论glEnableVertexAttribArray的作用及调用位置问题。

当我们特别谈论到顶点着色器的时候,每个输入变量也叫顶点属性(Vertex Attribute)。我们能声明的顶点属性是有上限的,它一般由硬件来决定。OpenGL确保至少有16个包含4分量的顶点属性可用,但是有些硬件或许允许更多的顶点属性,你可以查询GL_MAX_VERTEX_ATTRIBS来获取具体的上限:

int nrAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);
std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;
1
2
3
通常情况下它至少会返回16个,大部分情况下是够用了。

默认情况下,出于性能考虑,所有顶点着色器的属性(Attribute)变量都是关闭的,意味着数据在着色器端是不可见的,哪怕数据已经上传到GPU,由glEnableVertexAttribArray启用指定属性,才可在顶点着色器中访问逐顶点的属性数据。glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见,即,着色器能否读取到数据,由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。

那么,glEnableVertexAttribArray应该在glVertexAttribPointer之前还是之后调用?答案是都可以,只要在绘图调用(glDraw*系列函数)前调用即可。

不用glEnableVertexAttribArray对应属性时绘制内容为清除缓冲区颜色。在取消glEnableVertexAttribArray(0);注释后我的代码就可以得到正常的绘制结果。

部分内容来自:简书-熊皮皮 
链接:http://www.jianshu.com/p/b05884a0ff8e 
learnopengl.com以及learnopengl-cn.github.io

原文地址:https://blog.csdn.net/gongxun1994/article/details/78271870

posted on 2021-01-08 16:57  ZhYQ_note  阅读(684)  评论(0编辑  收藏  举报

导航