浅入浅出游戏引擎笔记(一)
0/openGL环境搭建
在【从0开始手搓游戏引擎】系列里面,图形API是自己手动调用的,刚开始Windows窗体和DX11还好,到了openGL真的就是噩梦,虽然说openGL的跨平台做的非常好,但是作为初学者上来就接触这么多代码还是有点发怵。索性可以通过glfw可以通过几行代码生成整个OpenGL环境,果然学一门东西还是要从简单的开始入手,没有几个人能够撑下来“这是攻击,这是防御,这是大树守卫环节”。
下面是涉及到的代码,我尽量用我的理解写下来
1 |
|
大体表述的处理流程就是下面这样:
1/绘制图形
| 文件名称 | 文件描述 |
|---|---|
| main.cpp | 主逻辑 |
| VertexData.h | 顶点数据(坐标、颜色) |
| ShaderSource.h | Shader代码(顶点Shader和片段Shader) |
VertexData.h用来存放需要绘制的三角形相关顶点数据
1 |
|
然后是着色器的代码,由于本人对着色器仍然处于一知半解的状态,所以就只贴代码.大体来说就是告诉显卡顶点该怎么绘制,顶点间的片段该怎么绘制
1 | // |
看完之后,我大致的理解就是下图:
Shader本质上来说就是运行在GPU上面的程序
目前市面上的手机,很大一部分仍然是OpenGL ES3.0的版本或更低。
Computer Shader在OpenGL ES 3.1版本才开始支持。
Geometry Shader在OpenGL ES 3.2版本才开始支持。
2/顶点着色器
顶点着色器的功能就是:
对输入的顶点坐标进行处理,然后再输出。
版本限定
1 |
每个Shader开头的语句,就是版本限定,也就是说如果你的设备不支持这个版本,那么这个Shader将直接被跳过
统一变量与属性变量以及输出变量
1 | uniform mat4 u_MVPMatrix; |
由于Shader是运行在GPU上的程序,而GPU是并行运算的.二者的区别就在于一组顶点如果分摊到GPU的逻辑单元,如果每个逻辑单元处理的是相同的数据,那么就称之为统一变量,反之就是属性变量
变量的修饰有点类似于OOP中的public与private
attribute所修饰的属性变量每执行一次Shader就需要被重新赋值
输出变量由varying关键字修饰,用于从顶点着色器,传递数据到片段着色器。
每个Shader都有入口函数 main(),顶点Shader主要工作就是:计算坐标。
得到坐标计算结果后,传给内置变量 gl_Position。
GPU拿到gl_Position,执行裁剪。
3/片段着色器
片段着色器(像素着色器)的功能就是:输出颜色。
片段着色器(像素着色器)也是并行的,不过执行的次数不是顶点个数,而是屏幕像素个数。
举例绘制一个960x540的长方形,每一个像素点的颜色,都是通过执行一次片段着色器来得到,那么GPU需要执行960x540次。
顶点着色器的输出变量,就是片段着色器的输入变量
片段着色器一般都是输出到
gl_FragColor这个内置变量。
所有从顶点着色器输出到片段着色器的数据,都会插值!
4/UV
UV坐标指的是顶点对应在图片的哪个位置
UV的坐标范围是[0f, 1f],UV映射就是顶点坐标和贴图对应起来的操作.
贴图文件大致分为三种:
- 没有压缩的图片格式 bmp
- CPU压缩的图片格式 无损压缩:png,有损压缩:jpg
- 显卡支持的图片格式
贴图的显示方式差不多就是下面这样:
5/杂项笔记
在GPU上创建对象,都是分三步,调用3个API:
glGenxxxx在GPU上进行创建xx对象glBindxxx将xx对象指定为类型glxxxxxxx上传数据





