现代OpenGL学习笔记(一)入门阶段知识点随记

vao(Vertex Array Object)到底会记录哪些调用?

vao会记录:

  1. glEnableVertexAttribArray和glDisableVertexAttribArray的调用
  2. glVertexAttribPointer的调用和glVertexAttribPointer调用时,对应的vbo对象
  3. ebo(Element Buffer Object)的绑定情况

第一个条目不再赘述,记下就完事。

对于第二个条目需要解释一下,vao会记录下glVertexAttribPointer的调用和glVertexAttribPointer调用时对应的vbo对象,我们知道,vbo本身只是用来储存顶点数据的,不储存任何“这些数据的意义”相关的信息,也就是说,对於单个vbo来说,它里面只储存了顶点数据,至于如何解读这些数据、这些数据是颜色数据还是位置数据,都与vbo无关。如何解读vbo里的数据、vbo里的数据是什么,这两个问题交由glVertexAttribPointer来解决,glVertexAttribPointer会向vao说明如何解读vbo里的数据,vao会记录下这个信息,除此之外,vao还会记录下glVertexAttribPointer调用对应的是哪个vbo对象,也就是调用glVertexAttribPointer时,正在绑定中那个的vbo。

第三个条目,vao会绑定ebo的绑定情况是指:如果在绑定vao期间,我们绑定了一个ebo对象,并且在解绑vao之前都没有解绑这个ebo,那么下次绑定vao的时候,将会一起绑定上这个ebo。而如果我们在vao期间解绑了ebo对象,那么下次绑定vao的时候就不会绑定这个ebo对象。

 

 

ebo(Element Buffer Object)的作用以及顺序问题?

ebo主要用于储存顶点的绘制顺序,假如我们要渲染一个正方形,我们需要六个顶点组成两个三角形,以此来绘制一个正方形(使用glDrawArrays)。我们知道,一个正方形只有四个顶点,但是由于OpenGL只认三角形的原因,我们不得不额外地增加两个重叠的顶点,增加了50%的内存开销,如果绘制更多边形,我们会增加更多的内存开销。ebo就是为这种情况而生,ebo可以指定顶点的绘制顺序以组成三角形,假设我们要绘制一个四个顶点顺时针顺序为(0,1) (1,1) (1,0) (0,0)的正方形,那么我们可以使用一个ebo,给他一个索引数组{0,1,2,0,3,2},让他先绘制三个顶点为(0,1) (1,1) (1,0)的三角形,然后绘制顶点为(0,1) (0,0) (1,0)的三角形,以拼成一个正方形。可以看到,ebo里存的数据其实就是顶点的绘制顺序,0代表vbo里的第一个顶点,1代表第二个,以此类推,而ebo的索引,又会被三个三个地视为三角形的顶点索引,以此来通过ebo绘制大量的三角形。

 

 

2D纹理相关的注意事项

LearnOpenGL里讲解得很好,需要复习时直接看他的讲解就能理解个大概,这里写一些细节内容

  1. 纹理座标系和局部空间(物体空间)座标系是不同的,要注意区分,纹理座标系原点在屏幕左下角,而局部座标系原点在屏幕中心点,xy轴的方向是一致的。
  2. 要给图形贴图需要两个东西,纹理座标、纹理。纹理座标一般是合并到顶点数据vbo里一并处理,纹理需要先把图片数据加载到内存里然后传给shader里的sampler2D变量使用。
  3. glActiveTexture的参数GL_TEXTUREX(其中X是正整数),对应激活shader里sampler2D变量,GL_TEXTURE0代表激活shader里第一个定义的sampler2D变量,GL_TEXTURE1代表第二个定义的sampler2D变量,以此类推,激活sampler2D变量后就可以将纹理,也就是加载到内存里的图片数据,传到对应的sampler2D变量。

 

 

先写这么多.

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章