zoukankan      html  css  js  c++  java
  • Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率

    目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:
    第一步:将输入的数据复制一份到缓冲区,供OpenGL使用。而这块新出现的区域由VBO管理和表示。(若有多个输入数据,则分区管理也就是说创建出VBO1 VBO2 ...等)特别提醒VBO 0 是解绑位置。
    第二步:当VBO创建完成后 我们就需要绑定当前VBO 即glBindBuffer(GL_ARRAY_BUFFER, VBO); 这一步绑定 是为了让后续向缓冲区复制数据的时候 不用表明目的地。
    第三步:绑定完成后,从这一刻起,我们使用的任何(在GL_ARRAY_BUFFER目标上的)缓冲调用,都将用来配置我们当前的VBO 这里用到的是缓冲调用

       glBufferData(GL_ARRAY_BUFFER, sizeof(指向输入的pointer), 指向输入的pointer, GL_STATIC_DRAW);

    第四步:设置顶点属性指针,使得它能让我们的顶点着色器准确解释 顶点属性。在这之后,不要忘记激活当前顶点属性。(依靠顶点属性的位置值)

    从之前的例子中我们可以看到,光是单一物体的一种positon顶点属性就已经很麻烦了。要是有很多物体并且每个物体又有很多顶点属性的话,那岂不是每次想要调度顶点着色器的时候我们就要写很多代码。这样很没效率,所以在这里引入一个类似于VBO的对象——VAO(顶点数组对象)。这个对象用于管理一套完整的顶点属性配置应使用的VBO的顶点数组对象。也就是说,每个VAO就相当于之前一套操作的封包。
     
    当然,VAO的绑定必须先于VBO。 大家可以看以下例子:
    // ..:: 初始化代码(只运行一次 (除非你的物体频繁改变)) :: ..

     // 1. 绑定VAO glBindVertexArray(VAO);

    // 2. 把顶点数组复制到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 3. 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0);

    //4. 解绑VAO glBindVertexArray(0);

    接下来,我们就可以进入到,主游戏循环当中

    glUseProgram(shaderProgram);  //启动着色器程序

    glBindVertexArray(VAO);        //绑定目标VAO

    someOpenGLFunctionThatDrawsOurTriangle();

    glBindVertexArray(0);  // 解绑

    这样调用的话VAO可以被重复调用,只要事先绑定相应VAO。

    今天暂时到这里,过几天再更新,趁着开学这几天还不是很忙。。

  • 相关阅读:
    [linux]进程(七)——进程通信
    [linux]进程(六)——守护进程
    [linux]进程(五)——进程调度
    [linux]进程(四)——进程的创建
    [linux]进程(三)——idle进程
    [linux]进程(二)--进程地址空间
    [linux]进程(一)--基本概念
    控制input输入框中提示信息的显示和隐藏的方法
    获取class名以某个字符开头的元素,获取class名以某个字符结尾的元素,
    vue本地代理实现跨域
  • 原文地址:https://www.cnblogs.com/LuoRuidiLoveMiku/p/11430830.html
Copyright © 2011-2022 走看看