顶点着色器
几何着色器
光栅化,剪切
片段着色器
片段着色器的主要目的是计算像素的最终颜色,这通常是所有高级OpenGL效果出现的阶段。通常片段着色器包含有关3D场景的数据,它可以用来计算最终的像素颜色(如灯光,阴影,光线颜色等)。
alpha测试和混合阶段
在确定了所有相应的颜色值之后,最终的对象将通过另一个阶段,我们称之为alpha测试和混合阶段。该阶段检查片段的相应深度(和模版)值(我们稍后会获取),并使用它们来检查结果片段是在其他对象的前面还是后面,并且应该相应地丢弃。该阶段还检查alpha值(alpha值定义对象的不透明度)并相应地混合对象。因此,即使在片段着色器中计算像素输出颜色,最终的像素颜色在渲染多个三角形时仍可能完全不同。
如您所见,图形管线相当复杂,并且包含许多可配置的部分。 但是,对于几乎所有的情况,我们只需要使用顶点和片段着色器。 几何着色器是可选的,通常保留为其默认着色器。
glBufferData()是专门用于将用户定义数据复制到当前绑定缓冲区的功能。
它的第一个参数是我们想要将数据复制到的缓冲区的类型:当前绑定到GL_ARRAY_BUFFER目标的顶点缓冲区对象。
第二个参数指定了我们想要传递给缓冲区的数据大小(以字节为单位) 一个简单的顶点数据就足够了。
第三个参数是我们想要发送的实际数据 第四个参数指定我们希望显卡如何管理给定的数据。
GL_STATIC_DRAW:数据很可能根本不会改变或很少改变。
GL_DYNAMIC_DRAW:数据可能会改变很多。
GL_STREAM_DRAW:数据每次绘制时都会改变。
三角形的位置数据不会改变,并且对于每个渲染调用都保持不变,因此其使用类型最好是GL_STATIC_DRAW。 例如,如果一个缓冲区的数据可能会频繁变化,那么GL_DYNAMIC_DRAW或GL_STREAM_DRAW的使用类型可确保图形卡将数据放入内存,以便进行更快速的写入。
glShaderSource()
函数将着色器对象编译为第一个参数。
第二个参数指定我们作为源代码传递了多少个字符串,这只是一个。
第三个参数是顶点着色器的实际源代码,我们可以将第四个参数保留为NULL。
通常,当你想要绘制多个对象时,首先生成/配置所有的VAO(以及所需的VBO和属性指针)并将其存储起来供以后使用。当我们想绘制一个物体时,我们采取相应的VAO,将其绑定,然后绘制物体并再次解除VAO的绑定。
GLSL中的矢量是1,2,3或4个组件容器,适用于刚刚提到的任何基本类型。 他们可以采取以下形式(n代表组件的数量):
vecn:n个浮点的默认向量。
bvecn:n个布尔值的矢量。
ivecn:n个整数的向量。
uvecn:n个无符号整数的向量。
dvecn:n个双重组件的向量。
大多数时候我们会使用基本的vecn,因为浮点数对于我们大部分的用途来说已经足够了。
可以通过vec.x访问矢量的组件,其中x是矢量的第一个组件。 您可以使用.x,.y,.z和.w分别访问它们的第一,第二,第三和第四个组件。 GLSL还允许您使用RGB颜色或STPQ纹理坐标,访问相同的组件。矢量数据类型允许一些有趣且灵活的组件选择,称为swizzling。