在一的基础上绘制一个三角形
理论:
opengl使用图形渲染管线来把2D坐标转换成3D坐标,他可以分为两部分:一是把3D坐标转换到屏幕的2D坐标,二是为这些2D坐标转变成有颜色的像素。
图形渲染管线接受一组3D坐标,将其转换成屏幕上的2D像素,其中经过这样几个阶段
3D顶点坐标输入->顶点着色器->形状图元装配->几何着色器->光栅化->片段着色器->混合与测试
1、顶点着色器:将输入的3D坐标转换成另一种3D坐标来给下个阶段使用
2、形状图元装配,将顶点着色器处理的3D坐标装配成指定的形状(比如三角形),然后输出给几何着色器
3、几何着色器,几何着色器可以为装配好的图元加上额外的顶点来构建新的图元,然后进行光栅化
4、光栅化,将图元映射为最终的屏幕上的像素,进过裁切后交给片段着色器
5、片段着色器,对留下的像素颜色进行处理的地方我们很多的效果便在这里实现(比如锐化),这里得到的颜色便是像素最终的颜色之后进入混合与测试
6、混合与测试又称alpha测试与混合,alpha即像素透明度,混合即把像素按照不同的透明关系混合;深度测试则是测试3D空间中物体的遮挡关系,决定最后剩下的哪些像素应该显示在前,哪些被遮挡舍弃;模板测试决定3D空间中物体那些部分应当显示(由程序员决定的)哪些被剔除。
在渲染一个三角形时我们首先会需要一组顶点坐标
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
由x/y/z坐标确定一个点的空间位置,三个点确定一个三角。此处所有顶点的Z坐标为0.0,故它们之间不存在遮挡关系。
接着我们会需要一个顶点缓冲VBO
顶点着色器会将上面的3D坐标转化为 “标准化设备坐标” ,标准化坐标系是一个2维坐标系,x,y轴的值被限定在(-1,1)内,故我们之前的三角的坐标均未超过(-1,1)的范畴。
“标准化设备坐标”之后会被转化成“屏幕空间坐标”,这通过 “视口变换” 来完成,也就是上一篇使用的glViewPort(width,height,null.null);
即把x(-1,1);y(-1,1)范围内的坐标转换到x(0,width);y(0,height)的范围里。之后的 “屏幕空间坐标” 再传递给片段着色器。
但首先,我们得把顶点数据发送到顶点着色器。
此时我们会需要:顶点缓冲对象VBO。
opengl采用的是c语言,我们首先用unsigned int创建一个VBO。
再使用glGenBuffers(1,VBO);来生成一个VBO“对象”。
再通过glBindBuffer(GL_ARRAY_BUFFER,VBO);告知我们当前使用的顶点缓冲为VBO。
最后用glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);来把顶点数据绑定到当前的顶点缓冲(GL_ARRAY_BUFFER意味着我们是为顶点缓冲绑定)也就是VBO上。
完整代码如下:
unsigned int VBO;
glGenBuffers(1,VBO);
//生成数量 要生成的缓冲对象
glBindBuffer(GL_ARRAY_BUFFER,VBO);
//缓冲类型 缓冲对象
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
//缓冲类型 缓冲数据大小 实际缓冲数据指针 管理缓冲数据的方式
此时VBO就已经拥有了顶点数据,特别提一下glBufferData中的GL_STATIC_DRAW,这个函数的第四个参数决定的是
“我们希望显卡管理缓冲数据的方式”
GL_STATIC_DRAW 几乎不改变顶点数据
GL_DYNAMIC_DRAW 顶点数据经常改变
GL_STREAM_DRAW 顶点数据每次绘制都改变
介于我们的这个三角不会改变顶点故选择GL_STATIC_DRAW
链接顶点数据
拥有顶点缓冲后我们需要告知opengl如何解析这些数据,但首先我们看看顶点缓冲中的数据应当怎么解析。
float vertices[] = { -0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f };
如上所示,所有的数据连续排列ÿ