OpenGL 状态机
openGL有记忆功能, 可以记住当前的状态 , 可以根据接收的输入和自己原先的状态,修改自己当前的状态
顶点数组和顶点缓冲区
存储在内存中的顶点数据,叫做顶点数组
将内存中的顶点数据存储在缓存中, 叫做顶点缓冲区
各个阶段的shader
顶点着色器
一般用来处理图片的顶点变化(旋转/平移/投影等)
顶点着色器是逐个顶点运算的程序(每个顶点数据都会被执行一次顶点着色器)当然这是并行的,并且顶点着⾊器运算过程中⽆法访问其他顶点的数据
片元着色器
一般⽤用来处理理图形中每个像素点颜⾊色计算和填充
片段着色器是OpenGL中用于计算片段(像素)颜色的程序。片段着色器是 逐像素运算的程序,也就是说每个像素都会执行⼀次片段着色器,当然也 是并⾏的
OpenGL 坐标变换
这里有一部分是用户自定义的变换, 有一部分是 OpenGL的变换(如下图所示:)
OpenGL 渲染架构
- Vertex Shader可以接收Attributes、Uniforms、Texture Data。
- Fragment Shader(片元着色器)只可以接收Uniforms、Texture Data,不能直接接收Attributes。
Attributes变量是只能在vertex shader(顶点着色器)中使用的变量,一般用来表示顶点的坐标,法线,顶点的颜色等。
Uniforms就像是C语言中的常量,Shader只能用不能修改,一般用来表示变化矩阵、材质、光照参数、颜色信息等。
Texture Data(纹理) 现实生活中,纹理最通常的作用是装饰我们的物体模型,它就像是贴纸一样贴在物体表面,使得物体表面拥有图案。但实际上在OpenGL中,纹理的作用不仅限于此,它可以用来存储大量的数据,一个典型的例子就是利用纹理存储地形信息。
OpenGL渲染架构图分为客户端和服务端两部分
客户端是Application程序和OpenGL的API,在CPU中执行,负责传递Attributes、Uniforms、Texture Data。
服务端负责接收客户端数据进行渲染,在GPU中执行。
Primitive Assembly(图元装配)把顶点着色器输出的顶点组合成点,线段或者三角形。
光栅化 图元装配之后的图形映射到屏幕上,确定在屏幕上每个像素点的位置。
glEnable 的常用地方
- 表面剔除 (绘制观察视角可以看到的面, 看不到的面则不再绘制)
// - 开始表面剔除
glEnable(GL_CULL_FACE);
关闭表⾯面剔除(默认背⾯面剔除)
void glDisable(GL_CULL_FACE);
// - 背面剔除
glCullFace(GL_BACK);
- 深度测试(对于要绘制出来的东西, 由于相交的部分存在前后遮挡的情况,所以有了深度测试, 保留靠近观察者的部分, 远离观察者的部分就不再绘制了)
// - 开启深度测试
glEnable(GL_DEPTH_TEST);
// - 在绘制场景前,清除颜色缓存区,深度缓冲 glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- 颜色混合(绘制的部分存在相交的可能, 并且近观察者的颜色是半透明的,则需要有颜色混合的操作)
// - 颜色混合
glEnable(GL_BlEND);
// - 设置混合函数
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
顶点坐标系和纹理坐标系
// - 使用图片纹理和视频纹理时候, 需要翻转坐标系, 图片纹理在解压图片时候翻转, 视频纹理在设置顶点和纹理坐标时候翻转
A ----------------- B
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
D ----------------- C
顶点坐标系 : (-1, 1), (1, 1), (1, -1), (-1, -1)
纹理坐标系 : (0, 1), (1, 1), (1, 0), (0, 0)
屏幕坐标系 : (0, 0), (320, 0), (0, 480), (320, 480)
项目地址(带注释)