基础图形管线
OpenGL 中的图元只是顶点的⼏何以及预定义的⽅式结合在⼀起。
管线分为2个部分,上半部分是客户端,下半部分为服务器端。
服务器端和客户端是功能和运⾏上都是异步,它们是各⾃独⽴的软件块和硬件块。
![](https://img.haomeiwen.com/i2283996/d6ff2603ac3c1986.png)
- 三种向OpenGL 着⾊器传递渲染数据的⽅法
Texture Data :纹理数据
Uniforms:通过设置Uniform 变量就紧接着发送⼀个图元批次处理命令
Attributes:属性,对⼀个顶点都要作出改变的数据元素 - 渲染过程,必备2个着⾊器
Vertex Shader: 顶点着色器
Fragment Shader: 片元着色器
投影
-
正投影
视景体外的⼏何图形,就会被裁减掉
所有在这个空间范围内的所有东⻄都将被呈现在屏幕上。⽽
不存在照相机或视点坐标系的概念。
image.png
-
透视投影
透视投影会进⾏透视除法对距离观察者很远的对象进⾏缩短和收缩。在投影到屏幕之后,视景体背⾯与视景体正⾯的宽度测量标准不同。
GLFrusmstum::setPerspective(float fFov , float fAspect , float fNear , float fFar)
参数:
fFov:垂直⽅向上的视场⻆度
fAspect:窗⼝的宽度与⾼度的纵横⽐
fNear:近裁剪⾯距离
fFar:远裁剪⾯距离
纵横⽐ = 宽(w)/⾼(h)
image.png
使用着色器
在OpenGL 核⼼框架中,并没有提供任何内建渲染管线,在提交⼀个⼏何图形进⾏渲染之前,必须实现⼀个着⾊器。
可以使⽤存储着⾊器。这些存储着⾊器由GLTools的C++类GLShaderManager管理。它们能够满⾜进⾏基本渲染的要求。
存储着⾊器分类
- 单位着⾊器(Identity 着⾊器)
GLShaderManager::UserStockShader(GLT_ATTRIBUTE_VERTEX,GLfloat vColor[4]);
只是简单地使⽤默认笛卡尔坐标系(坐标范围(-1.0,1.0)),所有的⽚段都应⽤同⼀种颜⾊,⼏何图形为 实⼼和未渲染的。
需要设置存储着⾊器⼀个属性GLT_ATTRIBUTE_VERTEX(顶点分量)
参数2:vColor[4],你需要的颜⾊
- 平⾯着⾊器
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[1 6],GLfloat vColor[4]);
参数1:平⾯着⾊器
参数2:允许变化的4*4矩阵
参数3:颜⾊
它将统⼀着⾊器进⾏了拓展。允许为⼏何图形变换指定⼀个 4 * 4 变换矩阵。经常被称为“模型视图投影矩阵”
- 上⾊着⾊器
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLflot mvp[16]);
在⼏何图形中应⽤的变换矩阵。
需要设置存储着⾊器的 GLT_ATTRIBUTE_VERTEX(顶点分量)和GLT_ATTRIBUTE_COLOR(颜⾊分量) 2个属性。颜⾊值将被平滑插⼊顶点之间(平滑着⾊)
- 默认光源着⾊器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1:默认光源着⾊器
参数2:模型视图矩阵
参数3:投影矩阵
参数4:颜⾊值
这种着⾊器,是对象产⽣阴影和光照的效果。需要设置存储着⾊器的 GLT_ATTRIBUTE_VERTEX(顶点分量) 和GLT_ATTRIBUTE_NORMAL(表⾯法线)
- 点光源着⾊器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
参数1:点光源着⾊器
参数2:模型视图矩阵
参数3:投影矩阵
参数4:视点坐标光源位置
参数5:颜⾊值
点光源着⾊器和默认光源着⾊器很相似,区别在于:光源位置是特定的。同样需要设置存储着⾊器的 GLT_ATTRIBUTE_VERTEX(顶点分量) 和GLT_ATTRIBUTE_NORMAL(表⾯法线)。
- 纹理替换矩阵
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
参数2:模型视图投影矩阵
参数3:纹理单元
着⾊器通过给定的模型视图投影矩阵,使⽤绑定到 nTextureUnit (纹理单元) 指定纹理单元的纹理对⼏何图形进⾏变化。⽚段颜⾊:是直接从纹理样本中直接获取的。需要设置存储着⾊器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和GLT_ATTRIBUTE_NORMAL(表⾯法线)
- 纹理调整着⾊器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数2:模型视图投影矩阵
参数3:基本⾊
参数4: 纹理单元
将⼀个基本⾊ 乘以 ⼀个取⾃纹理单元 nTextureUnit 的纹理。需要设置存储着⾊器的 GLT_ATTRIBUTE_VERTEX(顶点分量) 和GLT_ATTRIBUTE_TEXTURE0(纹理坐标)
- 纹理光源着⾊器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLight Pos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
参数1:纹理光源着⾊器
参数2:模型视图矩阵
参数3:投影矩阵
参数4:视觉空间中的光源位置
参数5:⼏何图形的基本⾊
参数6:将要使⽤的纹理单元
将⼀个纹理通过漫反射照明计算机进⾏调整(相乘)。光线在视觉空间中的位置是给定的。需要设置存储着⾊器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和GLT_ATTRIBUTE_TEXTURE0(纹理坐标)、GLT_ATTRIBUTE_NORMAL(表⾯法线)
- 常用代码
定义着⾊器GLShaderMananger shaderMananger;
初始化着⾊器shaderMananger.initalizeStockShaders();
使⽤shaderMananger.userStockMananger(参数列表)
图元
使用OpenGL在屏幕进行绘图,我们不关注物理屏幕坐标和像素,关注的是视景体中位置坐标,将这些点、线、三角形从3D空间投影到屏幕上的2D图像是由着色器程序和光栅化硬件完成的。
- 点 GL_POINTS
最简单的图形,一般是占一个像素大小
//1.修改点的像素大小
glPointSize(4.0f);
// 设置点的大小范围,
GLfloat sizes[2] = {2.0f,4.0f};
glSetFloatv(GL_POINT_SIZE_RANGE,sizes);
// 获取点大小范围
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
// 设置点与点间距
GLfloat step = 1.0f;
glSetFloatv(GL_POINT_GRAULARITY,&step);
// 获取最小步长
glGetFloatv(GL_POINT_GRAULARITY,&step);
// 通过程序点大小模式来设置点大小
glEnable(GL_PROGRAM_POINT_SIZE);
// 这种模式允许我们在顶点着色器几何着色器中通过着色器内建变量直接修改
gl_PointSize = 5.0;
- 线 GL_LINES
两个顶点绘制成一条线段,默认1个像素
// 设置线段的宽度
glLineWidth(2.5f);
-
线带 GL_LINE_STRIP
将顶点依次连接起来形成线带 -
线环 GL_LINE_LOOP
额外增加一条,将线带闭合成环 -
三角形 GL_TRIANGLES
最简单的实体多边形,OpenGL中支持的唯一一种多边形,光栅化硬件最欢迎三角形。 -
环绕
image.png
OpenGL 默认逆时针环绕为正面,顺时针环绕为反面
// 定义前向和背向
glFrontFace(GL_CCW)
// GL_CCW:逆时针为前向
// GL_CW : 顺时针为前向
-
三角带 GL_TRIANGLE_STRIP
三个顶点绘制成一个三角形,然后每增加一个顶点可以再绘制一个三角形,形成三角带,使用GL_TRIANGLE_STRIP图元 -
三角形扇 GL_TRIANGLE_FAN
第一个顶点V0构建三角形扇的原点,用前三个顶点指定最初的三角形,之后的每个顶点都和原点以及Vn-1的顶点构成一个三角形,使用GL_TRIANGLE_FAN
(本文为学习笔记,相关资料来自CC老师)
网友评论