ayout(location=0) in vec4 vPosition

#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);

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值