理解glVertexAttribPointer()函数
OpenGL glVertexAttribPointer()函数解析-CSDN博客
难理解的是最后一个参数。
这个参数指明了,顶点属性的数据从哪里获取。
# 如果是(void*) 0,则表示数据从已绑定的VBO中获取,从第1个元素(0号)开始
# 如果是(void*) myarray+3 ,则表示数据从C++数组myarray中获取,从第4个元素(3号)开始
此外,如果选择数据源为C++数组,那么绘制时,就要记得解绑VBO,否则会发生冲突
关于纹理
在一个着色器中有多个“纹理单元”,其中,0号纹理单元默认激活
得到一个完整的纹理缓冲区的步骤为:
1.创建纹理缓冲
2.绑定纹理缓冲
3.载入图片的字节流
4.解绑纹理缓冲
加载纹理缓冲区的步骤为:
1.激活n号纹理单元
2.绑定纹理缓冲(会绑到n号纹理单元上)
ps:0号纹理单元是默认激活的,所以直接绑定纹理缓冲时,会绑到0号单元上。
在片段着色器中使用纹理
定义sampler2D 类型的uniform变量:uniform sampler2D ourTexture2;
指定该sampler2D与哪一个纹理单元对应: glUniform1i( 变量ourTexture2的位置, 纹理单元编号)
获取纹理颜色:color = texture(ourTexture2, UV坐标)
对各种解绑,绑定行为的理解
那么VAO存在的意义是什么?
虽然解绑后“顶点缓冲区”内容不会改变,但是缓冲区的"排列方式"没有记录下来(glVertexAttribPointer)
而VAO = 顶点缓冲区+排列方式
VAO本身也算是一个缓冲区~