使用方式
先来看着顶点色器程序
const char vShaderStr[] =
"#version 300 es \n"
"layout(location = 1) in vec4 a_position; \n"
"layout(location = 0) in vec4 a_color; \n"
"out vec4 v_color; \n"
"void main() \n"
"{ \n"
" v_color = a_color; \n"
" gl_Position = a_position; \n"
"}";
着色器程序中有两个输入属性变量a_position
和a_color
,它们对应的index分别为1和0。
下面开始传递值给属性变量location=1
/**
* 指定index=1的顶点属性,将传给顶点着色器location=1的属性变量
* 属性向量维度为3,{x,y,z}
* 精度 GL_FLOAT
* 强制规范化 GL_FALSE
* 读取方式,0表示顺序读取,没有间隔
* 属性数组指针 vertexPos
*/
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, vertexPos);
//开启属性变量1,对应着色器程序location=1的属性变量
glEnableVertexAttribArray(1);
//使用完后关闭属性变量
glDisableVertexAttribArray(1);
为什么要先开启属性变量
出于性能考虑,默认情况下所有顶点着色器的属性(Attribute)变量都是关闭的,意味着数据在着色器端是不可见的,哪怕数据已经上传到GPU,由glEnableVertexAttribArray启用指定属性,才可在顶点着色器中访问逐顶点的属性数据。glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见,即,着色器能否读取到数据,由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。
那么,glEnableVertexAttribArray应该在glVertexAttribPointer之前还是之后调用?答案是都可以,只要在绘图调用(glDraw*系列函数)前调用即可。
网友评论