#version 430 core
layout(location = 0) in vec4 vPosition;
void main(){
gl_Position = vPosition;
}
第一行#version 430 core 表示我们所使用的4.3版本的OpenGL对应的GLSL语言,core表示使用OpenGL的核心模式。
若#version没有设置,则默认使用110版本。
第二行layout(location=0) in vec4 vPosition 分配了一个着色器变量(着色器变量是着色器与外部世界的联系所在),就这么一行也是包含了许多内容,我们从右往左看:
1、vPosition指变量名称,它所保存的是顶点的位置信息
2、vec4是GLSL中的一种数据类型,在这里表示GLSL的四维浮点数向量,默认值为(0,0,0,1),表示(x,y,z,w)。当有字段缺失时,会填充对应的默认值。
3、in字段的话,表示设置这个变量,即vPosition为着色器阶段的输入变量,指定了数据进入着色器的流向,在这里代表数据从外部流入。
4、layout(location=0),这一字段非常重要,它将vPosition的位置属性location设置为0,为它提供了元数据。
// 绑定属性位置 vPosition :0 着色器中没有设定属性位置时使用
// GLES30.glBindAttribLocation(tmpProgram, 0, "vPosition");
/**
函数原型:void glVertexAttribPointer(GLuint index, GLint size, GLenum type,
GLboolean normalized, GLsizei stride, const GLvoid* pointer);
之前我们调用了glBindData所传递给缓存的只是数据,之后我们要使用它,还必须指定数据类型。
所以该函数完成的主要任务是:
1、告诉OpenGL,该存储数据的格式
2、因为我们使用着色器来编程,因此在顶点着色器阶段,我们会使用该函数来给着色器中的in类型的属性变量传递数据。
那么它们是怎么联系起来的呢?
便是通过第一个参数index,指明了着色器程序中变量的下标的作用。
例如:layout( location=index ) in vec4 position;
如果这个index和glVertexAttribPointer的第一个参数一样,那么相关缓存区的数据就会传递到这个position变量中去。
3、该函数执行之后,会影响改变VAO的状态,VBO会被复制保存到VAO中。之后如果改变了当前所绑定的缓存对象,也不会改变到VAO里的对象。
*/
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
/**
因为默认情况下,顶点属性数组是不可访问的,所以我们需要调用以下函数激活它。
范围为0到GL_MAX_VERTEX_ATTRIBS-1
*/
glEnableVertexAttribArray(vPosition);