OpenGL/OpenGL ES (一) —— 专业名词快速了解
OpenGL/OpenGL ES (二) —— 渲染架构、图元、着色器、投影
OpenGL/OpenGL ES (三) —— 绘制甜甜圈
OpenGL/OpenGL ES (四) —— 纹理
OpenGL/OpenGL ES (五) —— 纹理翻转策略
OpenGL/OpenGL ES (六) —— 立方体旋转
OpenGL/OpenGL ES (七) —— 初探
OpenGL/OpenGL ES (八) —— 如何加载一张图片
OpenGL/OpenGL ES (九) —— 光照
OpenGL渲染流程
看图说话渲染分为两部分组成,一部分是客户端,另一部分是服务器端。 服务器端由四个大的阶段组成
顶点着色器(Vertex Shader):处理从客户端输入的数据、应用变换、进行其他的类型的数学运算来计算光照效果、位移、颜色值等。为了渲染共有3个顶点的三角形,Vertex Shader将执行3次,也就是为了每个顶点执行一次。
图元装配 :通过
glDraw***
提供的顶点交到顶点着色器执行,顶点着色器变换的每个顶点包括描述顶点(x,y,z,w)值的顶点位置。图元类型和顶点确定将被渲染的单独图元,对于每个单独图元及对应的顶点将执行。顶点着色器输出-->裁剪-->透视分割-->透视变化-->再到下一个阶段光栅化。光栅化:对来自图元装配的图元进行光栅化处理,把它转换为二维片段,输出成屏幕的坐标、颜色属性、纹理坐标等交给片元着色的阶段处理。这就是光栅化的过程。
片元着色器 (Fragment Shader):对来自光栅化的每个片段通过执行Fragment Shader进行填充。Fragment Shader会输出我们将屏幕上看到的最终颜色值。
渲染:(Render):将图形/图像数据转换成3D空间图像。
在可编程管线中,我们能够编码的就是Vertex Shader(顶点着色器) 和 Fragment Shader(片元着色器)。
可以通过三种方式:
1、属性 (Attributes):就是一个对每个顶点都要作改变的数据元素。实际上,顶点位置本身就是一个属性。属性可以是浮点数、整数或布尔数据。
2、Uniform值 :通常设置Uniform变量就紧接着发出渲染一个图元批次的命令。可以无限制的使用。设置一个应用于整个表面的单个颜色值,还可以设置一个时间值。可以是浮点数、整数或布尔数据。
3、纹理(Texture Data): Vertex Shader和Fragment Shader都可以对纹理值进行采样和筛选。纹理数据的作用并不仅仅是表现图形(后期详解)
Attributes
不能够直接传递给Fragment Shader
,如果需要传递给Fragment Shader
,则需要通过Vertex Shade
间接的传递过去。而 Unifrom
和Texture Data
可以直接传递给Vertex Shader和
Fragment Shader`具体怎么传递,依需求而定。
投影
正投影
透视投影
GLFrustum类通过setPerspective 方法为我们构建一个平截头体。
参数:
fFov:垂直方向上的视场角度
fAspect:窗口的宽度与高度的纵横比
fNear:近裁剪⾯面距离
fFar:远裁剪面距离
纵横⽐比 = 宽(w)/高(h)
CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
固定存储着色器的分类
存储着色器的使用
GLShaderManager的初始化
// GLShaderManager初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
1、单位(Identity)着色器
单位着色器:只是简单地使用默认笛卡尔坐标系(范围-1.0~1.0)。所有的片段都应用同一种颜色,几何图形为实心和未渲染的。
参数1:存储着色器种类 - 单元着色器
参数2:颜色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
2、平面(Flat)着色器
平面着色器:将统一着色器进行了扩展,允许为几何图形变换指定一个4x4变换矩阵。在绘制时,可以应用变换(模型/投影变化)。
参数1:存储着色器种类 - 平面着色器
参数2:允许变化的4x4矩阵
参数3:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, FLfloat mvp[16], GLfloat vColor[4]);
3、上色(Shaded)着色器
上色着色器:这种着色器唯一的uniform值就是在几何图形种应用的变换矩阵。GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_COLOR(颜色分量)在这种着色器中都会使用。颜色值将被平滑地插入顶点之间(称为平滑着色)。
参数1:存储着色器种类 - 上色着色器
参数2:允许变化的4x4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
4、默认光源着色器
默认光源着色器:使对象产生阴影和光照的效果。需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 默认光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:颜色
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, FLfloat mvMatrix[16],GLfloat pMatrix[16], GLfloat vColor[4]);
5、点光源着色器
点光源着色器:点光源着色器和默认光源着色器很相似,但是光源位置可能是特定的。同样需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 点光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:点光源的位置
参数5:颜色
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, FLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
6、纹理替换矩阵着色器
纹理替换矩阵着色器:通过给定的模型视图投影矩阵,使绑定到nTextureUnit指定的纹理单元的纹理对几何图形进行变换。片段颜色时直接从纹理样本中直接获取的。所需的属性有GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 纹理替换矩阵着色器
参数2:模型4x4矩阵
参数3:纹理单元。
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
7、纹理调整着色器
纹理调整着色器:将一个基本色乘以一个取自纹理单元nTextureUnit的纹理。所需的属性有GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_TEXTURE0(纹理坐标)。
参数1:存储着色器种类 - 纹理调整着色器
参数2:模型4x4矩阵
参数3:颜色值
参数4:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
8、纹理光源着色器
纹理光源着色器:将一个纹理通过漫反射照明计算进行调整(相乘),广西在视觉空间中的位置是给定的,这种着色器接受5个Uniform值,即模型视图矩阵、投影矩阵、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。
所需的属性有GLT_ATTRIBUTE_VERTEX(顶点分量)、GLT_ATTRIBUTE_TEXTURE0(纹理坐标)和GLT_ATTRIBUTE_NORMAL(表面法线)。
参数1:存储着色器种类 - 纹理光源着色器
参数2:模型4x4矩阵
参数3:投影4x4矩阵
参数4:点光源位置
参数5:颜色值(几何图形的基本色)
参数6:纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix, GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vBaseColor[4], GLint nTextureUnit);