音视频学习笔记-OpenGL渲染流程以及固定存储着色器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shengpeng3344/article/details/90740633

OpenGL渲染架构

在这里插入图片描述
顶点着色器使用 Attributes 和 Uniform
片元着色器使用 Uniform
Attributes 一般是变动比较大的数据,例如顶点数据
Uniform 一般赋值了就不变动的数据,例如变换矩阵

由于OpenGL是基于C的API,因此它⾮常便携且受到⼴泛支持。作为C API,它与基于Objective-C的Cocoa应⽤程序⽆缝集成。 OpenGL提供应用程序⽤于⽣成2D或3D图像的函数。您的应⽤程序将渲染的图像呈现给屏幕或将它们复制回自⼰的内存。

OpenGL规范没有提供⾃己的窗⼝层。它依赖于OS X定义的功能来将OpenGL绘图与窗口系统集成。您的应⽤程序创建OS X OpenGL 渲染上下文并将渲染⽬标附加到其上(称为可绘制对象)。渲染上下文管理OpenGL状态更改和通过调用OpenGL API创建的对象

在这里插入图片描述

正投影

在这里插入图片描述

透视投影

在这里插入图片描述
GLFrustum类通过setPerspective ⽅方法为我们构建⼀一个平截头体。 CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
参数:
fFov:垂直⽅方向上的视场⻆角度 fAspect:窗⼝口的宽度与⾼高度的纵横⽐比 fNear:近裁剪⾯面距离 fFar:远裁剪⾯面距离
纵横⽐比 = 宽(w)/⾼高(h)

固定存储着色器

存储着色器初始化

// GLShaderManager 的初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();

单元着色器

GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
参数1: 存储着⾊器种类-单元着⾊器
参数2: 颜⾊
使⽤用场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有⽚片段都会以⼀一种颜⾊色填充

平面着色器

GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
参数1: 存储着⾊器种类-平面着⾊器
参数2: 允许变化的4*4矩阵
参数3: 颜⾊

扫描二维码关注公众号,回复: 6395103 查看本文章

使⽤用场景: 在绘制图形时, 可以应⽤用变换(模型/投影变化).

上色着色器

GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
参数1: 存储着⾊器种类-上⾊着⾊器
参数2: 允许变化的4*4矩阵
使用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 颜⾊将会平滑地插⼊到顶点之间称为平滑着⾊

默认光源着色器

GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1: 存储着⾊器种类-默认光源着⾊器
参数2: 模型44矩阵
参数3: 投影4
4矩阵
参数4: 颜⾊值
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果.

点光源着色器

GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
参数1: 存储着⾊器种类-点光源着⾊器
参数2: 模型44矩阵
参数3: 投影4
4矩阵
参数4: 点光源的位置
参数5: 漫反射颜⾊值
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣
阴影和光照的效果.它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的.

纹理替换矩阵着色器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

参数1: 存储着⾊器种类-纹理理替换矩阵着⾊器
参数2: 模型4*4矩阵
参数3: 纹理单元
使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵.使⽤纹理单元来进⾏颜⾊填充.其中每个像素点的颜⾊是从纹理中获取.

纹理调理着色器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理理调整着色器
参数2: 模型4*4矩阵
参数3: 颜⾊色值
参数4: 纹理单元
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理.将颜⾊与纹理进⾏颜色混合后才填充到⽚段中.

纹理光源着色器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理光源着⾊器
参数2: 模型44矩阵
参数3: 投影4
4矩阵
参数4: 点光源位置
参数5: 颜⾊值(⼏何图形的基本色)
参数6: 纹理单元
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵. 着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘).

OpenGL基本7种基本图元

图元 描述
GL_POINTS 每个顶点在屏幕上都是单独点
GL_LINES 每⼀对顶点定义⼀个线段
GL_LINE_STRIP ⼀个从第⼀个顶点依次经过每一个后续顶点而绘制的线条
GL_LINE_LOOP 和GL_LINE_STRIP相同,但是最后⼀个顶点和第⼀个顶点连接起来了.
GL_TRIANGLES 每3个顶点定义一个新的三角形
GL_TRIANGLE_STRIP 共⽤一个条带(strip)上的顶点的⼀组三角形
GL_TRIANGLE_FAN 以一个圆点为中心呈扇形排列,共⽤相邻顶点的⼀组三⻆形

在这里插入图片描述

OpenGL点线

1.最简单也是最常⽤用的 4.0f,表示点的⼤小
glPointSize(4.0f);
2.设置点的⼤小范围和点与点之间的间隔
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat step = 1.0f;
3.获取点⼤小范围和最⼩步长
glGetFloatv(GL_POINT_SIZE_RANGE ,sizes);
glGetFloatv(GL_POINT_GRAULARITY ,&step);
4.通过使⽤程序点⼤小模式来设置点⼤小
glEnable(GL_PROGRAM_POINT_SIZE);
5.这种模式下允许我们通过编程在顶点着⾊器或⼏何着⾊器中设置点⼤小。着⾊器内建变量: gl_PointSize,并且可以在着⾊器源码直接写
gl_PointSize = 5.0
6. 设置线段宽度
7. glLineWidth(2.5f);

OpenGL三角形

对于OpenGL 光栅化最欢迎的是三角形.3个顶点就能构成⼀个三⻆形. 三⻆形类型来自于顶点.并不是所有的三⻆形都是正三角形等。
在这里插入图片描述

OpenGL三角形环绕方式

在绘制第⼀个三⻆角形时,线条是按照从V0-V1,再到V2。最后再回到V0的⼀个闭合三⻆角形。 这个是沿着顶点顺时针⽅方向。这种顺序与⽅向结合来指定顶点的⽅式称为环绕。
在这里插入图片描述
在默认情况下,OpenGL 认为具有逆时针方向环绕的多边形为正面. 这就意味着上图左边是正⾯,右边是反面.
glFrontFace(GL_CW);
GL_CW:告诉OpenGL 顺时针环绕的多边形为正面;
GL_CCW:告诉OpenGL 逆时针环绕的多边形为正面;

OpenGL 三角带

对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三⻆角形. 这是我们可以使⽤用GL_TRIANGLE_STRIP 图元绘制一串相连 三角形,从而节省⼤量的时间.
在这里插入图片描述
优点:

  1. ⽤前3个顶点指定第1个三⻆形之后,对于接下来的每⼀个三角形,只需要再指定1个顶点。需要绘制⼤量的三⻆角形时,采用这种⽅法可以节省⼤量 的程序代码和数据存储空间
  2. 提供运算性能和节省带宽。更更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少了。

OpenGL三角形扇

对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三角形. 这是我们可以使⽤GL_TRIANGLE_FAN 图元绘制一组围绕⼀个中心点相连的三⻆形。
在这里插入图片描述

OpenGL 工具类GLBatch

GLBatch ,是在GLTools中包含的⼀一个简单容器器类。
void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);
参数1:图元
参数2:顶点数 参数3:⼀一组或者2组纹理理坐标(可选)
//复制顶点数据(⼀一个由3分量量x,y,z顶点组成的数组) void GLBatch::CopyVerterxData3f(GLfloat *vVerts);
//复制表⾯面法线数据
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
//复制颜⾊色数据
void GLBatch::CopyColorData4f(GLfloat *vColors);
//复制纹理理坐标数据
void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer);
//结束数据复制
void GLBatch::End(void);
//绘制图形
void GLBatch::Draw(void);

猜你喜欢

转载自blog.csdn.net/shengpeng3344/article/details/90740633