前言
非学不可的理由
- 本人入坑是需要GPU架构建模不得已啊啊啊啊!
- 需要图形编程的时候!
主要学习内容
- 核心的图形学概念:OpenGL怎样将像素绘制到屏幕上,以及如何利用黑科技做出一些很酷的效果。
- 许多有用的技巧:它们都可以用在你的程序中,比如说在场景中移动,做出漂亮的光照,加载建模软件导出的自定义模型,做一些很酷的后期处理技巧等。
一、什么是OpenGL
二、从立即渲染模式到细节渲染模式
- 立即渲染模式:早期模式,容易使用和理解,固定的渲染管线,函数更多功能被库隐藏,细节固定化,不够灵活。
- OpenGL3.2+:开始废弃立即渲染模式,开发者可以在OpenGL的核心模式(Core-profile)下进行开发,移除了旧的特性,对绘图细节有了更多的掌控----库开发者让渡出更多函数灵活性→用户开发者拥有更多函数功能主动权。
三、学习OpenGL需要储备的知识
- modern C++:请确保至少能写个比 ‘Hello World’ 复杂的程序;
- 数学知识(线性代数、几何、三角学);
- 对图形编程以及OpenGL的幕后运作有非常好的理解。
四、OpenGL开端必知
- GLFW:GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入,对我们来说这就够了。
- GLAD:GLAD是用来管理OpenGL的函数指针的库,给GLAD传入用来加载系统相关的OpenGL函数指针地址的函数。GLFW给我们的是
glfwGetProcAddress
,它根据我们编译的系统定义了正确的函数。- “gl”作为前缀:OpenGL库中所有的函数都是用gl作为前缀的,你应该要辨识出来。
- “GL_”作为前缀:OpenGL库中定义的常量都是用GL_作为前缀的,你也要辨识出来。
五、OpenGL管线 (rendering pipeline)
一系列处理过程,最终将应用程序的的数据转换到最终渲染的图像:
- 准备向OpenGL传入数据:传在where?保存到缓存对象(buffer object)相当于一块内存区域,用glNameBufferStorage()命令来同时设置大小和内容。
- 将数据传入OpenGL:以顶点为单位传入点数据包。
- 顶点着色:决定了图元的位置。一般一个应用程序有很多个顶点着色器,但在同一时刻只能有一个顶点着色器起作用。
- 细分着色:使用面片(patch)来描述一个物体形状,再用面片几何体连接,外观会变平顺。
- 几何着色:创建新的图元。
- 图元装配:把顶点和几何图元组织起来。
- 剪切:clipping,保证相关的像素不会落在视口外绘制,自动完成的过程。
- 光栅化:生成对应的片元,对每个可变变量进行线性插值
- 片元着色:决定了片元的颜色。
- 逐片元的操作:用深度测试(z缓存)、模板测试来决定一个片元是否可见。