主要是自己遇到的坑的笔记,参考教程还是:http://learnopengl-cn.readthedocs.io/zh/latest/ 的你好,窗口
和你好,三角形
章节。
1. glew库的初始化
在程序的最前面添加了glew初始化相关的如下代码段之后:
// Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
glewExperimental = GL_TRUE;
// Initialize GLEW to setup the OpenGL Function pointers
if (glewInit() != GLEW_OK)
{
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
发现没法跑了,debug了一下发现是初始化失败了。在看了官方的源代码之后发现glew的初始化必须在所有相关的GLFW操作完成之后进行。
2. 渲染管线(Pipeline)
渲染管线是深入了解图形学避不过的坎,我们需要清楚地知道,程序里面的一大堆乱七八糟的数据是怎么通过一系列的处理转化成我们想要的2D图像。一开始我的理解就像我们拍照一样,自然界如此繁杂,我们需要一个公式才能将这个场景转化为照片。
好,那么先看一下上面教程链接里的图,用心感受 (‘_>’):
先结合教程与自己的经验总结一下这里的整个渲染管线:
- 顶点着色器:“把3D坐标转为另一种3D坐标”,网上的GLSL会有详细地一些小伎俩,比如把原本是平面的图形通过叠加一个三角函数然后变成波浪形状。而实际应用中的话,之前自己做过的应用是计算光线方向、反射方向还有法线方向(可能还有更好的方法,这里比较low,但是的确顶点着色器目前的认知仅限于此,后面有机会会回头补充)。
- 图元装配: 暂时理解为组装成一个三角形,或四边形。
- 细分着色器: Tessellation这个词在很多讲座型课程中看到过,相关的优化之类的算法有很大的前景。曾看过相关的应该是根据距离的远近来决定使用不同层次的细分。目的就是创建平滑的视觉效果。
- 光栅化: 离散成像素点,然后喂狗(嗯)。
片段着色器: 在此前进行裁切,然后片段着色器的重点是:
包含用来计算像素最终颜色的3D场景的一些数据(比如光照、阴影、光的颜色等等
测试与混合: 这里直接引用做个笔记吧:
在所有相应颜色值确定以后,最终它会传到另一个阶段,我们叫做alpha测试和混合(Blending)阶段。这个阶段检测像素的相应的深度(和Stencil)值(后面会讲),使用这些,来检查这个像素是否在另一个物体的前面或后面,如此做到相应取舍。这个阶段也会检查alpha值(alpha值是一个物体的透明度值)和物体之间的混合(Blend)。所以,即使在片段着色器中计算出来了一个像素所输出的颜色,最后的像素颜色在渲染多个三角形的时候也可能完全不同。
3. 顶点缓冲
第一次接触这个概念,理解起来需要记一下:
(1) 目的
一次性发送大批数据到显卡上;
(2) 绑定与解绑
每次我们使用的时候都是全局先会有一个总的缓冲ID对象,然后在代码段的初始化阶段,进行数据的输入以及链接顶点属性。最后是在没帧的渲染中调用一次绘制函数。
按个人理解由于你的不同图元的属性不一样,所以和shader一样有对应的自己的顶点缓冲区,所以开始要分别对每种缓冲区设置其属性,然后才能在渲染时保持正确。