一、OpenGL渲染架构
只有顶点着色器和片元着色器的代码才在gpu上运行的,像main函数这些opengl的框架等代码都是cpu上运行的
openGL渲染流程(转载自收纳箱:https://www.jianshu.com/p/dc65d6e7ef04)
1、设置顶点数据和其他参数。
2、在顶点着色器中进行运算得到裁剪坐标。
3、细分着色器、几何着色器,不可自定义,跳过。
4、图元设置,根据设置构成点、线、三角形。
5、裁剪,裁剪掉超出显示区域的部分。
6、光栅化, 将图源栅格化为一个个的像素点。
7、片元着色器,将对应的栅格(像素)填充为具体的颜色。
8、渲染图像。
参数传递
1、Attributes:
只能传递到vsh(顶点着色器),再通过顶点着色器 - > 片元着色器
顶点数据x,y,z,w
光照坐标、投影矩阵、纹理坐标
2、统一变量Uniforms:
可在任意着色器访问,可以理解为全局常量
尽量少改动,频繁改动的建议使用 Attributes 传递
变换矩阵、通道、颜色值
3、texturedata:纹理数据
可以传向顶点着色器、片元着色器
但是传递给顶点着色器没有意义
3. 参数的使用
顶点着色器
我们可以通过attrubutes获取到顶点数据,通过uniforms获取到mvp矩阵,再进行运算得到最终的顶点坐标。
gl_Position = M_pro * M_view * M_model * V_local
片元着色器
比如在处理视频帧时,一般会使用YUV格式。要渲染到屏幕上需要将YUV格式转换为RGB格式。在片元着色器中,通过YUV数据进行矩阵运算就可以得到具体的RBG颜色值了。Alpha通道直接赋值为1.0。
RGB = YUV * 转换矩阵
纹理
像素数据。片元着色器中,可以通过纹理坐标获取到对应的颜色值。如果对得到的颜色值进行处理,就可以得到“滤镜”效果。
二、投影
正投影:在2d坐标系中显示2d图形
透视投影:在2d坐标系中显示3d图形(远小近大)
问题图:
答案c,正投影和透视投影都可以作为2d/3d图形的投影
三、着色器
1、固定着色器
// GLShaderManager 着色器管理类的初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
调用固定着色器方法
-UserStockShader(...)
2、 各种着色器
纹理替换矩阵着色器:前面将的都是单色的,这里就有图案的
纹理光源着色器:有光源、纹理、颜色混合
四、openGL图元连接方式
五、OpenGL 三角形带
三角形带:更少的顶点,节省大量的程序代码和数据空间,且速度更快。
三角形扇:需要绘制相连的三角形