最近找实习有一丢丢蛋疼,沉迷鬼泣5,四周目通关,又不想写代码,写篇笔记复习一下,要好好学图形学啊
用OpenGL画一个三角形
项目的简介
记录一下跟着learnOpenGL学习的过程
笔记里的代码放在github上,依赖都用相对路径配好了,直接下载就能用,IDE是VS2017,代码
选择Triangle项目作为启动项可以测试这个代码
使用的库是glad和glfw,感觉用glad和glfw开发OpenGL的方式和DX挺像的,也有可能是我见识少, 感觉很多教材用来教学的库都是GLUT, 嘛,学图形学的话也不必纠结这些(大概
项目的架构
1.窗口初始化
2.渲染
int main()
{
BaseInit();//窗口初始化,键盘、鼠标等事件的绑定
MainLoop();//渲染相关
return 0;
}
要测试某个代码,比如说画三角形的,画正方体的,在MainLoop里实现
void MainLoop()
{
NormalTriangle();
}
渲染管线
learnOpenGL里的渲染管线的抽象描述是这样的
我们如果要画三角形的画,其实只要关注顶点着色器和片段着色器部分就好,其他操作管线会帮我们完成
从代码的层面理解画一个三角形的逻辑的话大概是
- 创建一个9个元素的float数组,代表三角形的坐标
- 编译着色器
- 创建顶点数组对象(Vertex Array Object)VAO并绑定
- 创建顶点缓存数组(Vertex Buffer Object)VBO并绑定
- 使用图元为三角形的绘图方法画三角形
当然不要忘记使用着色器程序,在我的理解里,VAO是在OpenGL里用来识别渲染对象的一个标识,在使用glad和glfw的情况下,OpenGL的对象都是用无符号整形数据来存储。如果想要同时画两个物体,那么只要在两个VAO之间切换绑定即可
窗口初始化
//窗口初始化
void BaseInit()
{
glfwInit();//初始化
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//配置GLFW
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
screenWidth = 800.0f;
screenHeight = 600.0f;
//创建窗口
glWindow = glfwCreateWindow(screenWidth, screenHeight, "LearnOpenGL", nullptr, nullptr);
if (glWindow == nullptr)
{
cout << &#