美文网首页
OpenGL 渲染流程图解析及着色器梳理

OpenGL 渲染流程图解析及着色器梳理

作者: 丸疯 | 来源:发表于2020-07-09 22:36 被阅读0次

OpenGL渲染架构

OpenGL 渲染架构
  • 客户端(Client)
    暴露在外面的API,及我们去连接和使用的对应的操作代码
  • 服务器(Server)
    OpenGL的底层

Client向Server传值有三种方式

  1. Attributes(ins):只能传值给顶点着色器(Vertex Shader)。(顶点数据,x,y,z,w 光照坐标,投影矩阵,模型矩阵,纹理坐标(图片映射坐标))
  2. Uniforms:传值给顶点着色器(Vertex Shader)片元着色器(Fragment Shader)。一般用来传统一的批次(变换矩阵,通道,颜色值
  3. 纹理数据(Texture Data):传值给顶点着色器(Vertex Shader)片元着色器(Fragment Shader)

OpenGL运行的位置

OpenGL 代码运行位置

由于OpenGL是基于C的API,因此它是非常便携且受到广泛支持。做为C的API,他与基于Objective-C的Cocoa应用程序无缝集成。OpenGL提供应用程序用于生成2D或3D图像函数。应用程序将渲染的图像呈现给屏幕或将它们复制回自己的内存。

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

投影方式

正投影

正投影
SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax);

投影矩阵

投影矩阵
SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);

GLFrustum通过SetPerspective函数来构建一个平截体头
参数:
fFov:垂直方向上的视场角度
fAspect:窗口的宽度与⾼度的纵横⽐比
fNear:近裁剪面距离
fFar:远裁剪面距离
fAspect:宽(w)/高(h)


存储着色器(GLShaderManager)

// 创建及初始化
GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();

固定着色器

单元着色器(GLT_SHADER_IDENTITY)

shaderManager.UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);

GLT_SHADER_IDENTITY:存储着色器种类 - 单元着色器
GLfloat vColor[4]:颜色

平面着色器(GLT_SHADER_FLAT)

 shaderManager.UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);

GLT_SHADER_FLAT: 存储着色器种类 - 平面着色器
GLfloat mvp[16]:允许变化的4*4矩阵
GLfloat vColor[4]:颜色

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

上色着色器(GLT_SHADER_SHADED)

shaderManager.UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);

GLT_SHADER_SHADED:存储着色器种类 - 上色着色器
GLfloat mvp[16]:允许变化的4*4矩阵

使用场景:绘图时,可以应用变换(模型/投影变化)颜色平滑的插入顶点之间称为平滑着色

默认光源着色器 GLT_SHADER_DEFAULT_LIGHT

shaderManager.UseStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);

GLT_SHADER_DEFAULT_LIGHT: 存储着色器种类 - 默认光源着色器
GLfloat mvMatrix[16]:模型44矩阵
GLfloat pMatrix[16]:投影4
4矩阵
GLfloat vColor[4]:颜色

使用场景:绘制图形时,可以应用变换(模型/投影变化)。这种着色器会使绘制的图形产生阴影和光照的效果.

点光源着色器(GLT_SHADER_POINT_LIGHT_DIFF)

shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vColor[4]);

GLT_SHADER_POINT_LIGHT_DIFF: 存储着色器种类 - 点光源着色器
GLfloat mvMatrix[16]:模型44矩阵
GLfloat pMatrix[16]:投影4
4矩阵
GLfloat vLightPos[3]:光源位置
GLfloat vColor[4]:颜色

使用场景:绘制图形时,可以应用变换(模型/投影变化)。这种着色器会使绘制的图形产生阴影和光照的效果,光照的位置是固定的。

纹理替换矩阵着色器(GLT_SHADER_TEXTURE_REPLACE)

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, mvMatrix[16], GLint nTextureUnit);

GLT_SHADER_TEXTURE_REPLACE: 存储着色器种类 - 纹理替换矩阵着色器
GLfloat mvMatrix[16]:模型4*4矩阵
GLint nTextureUnit:纹理单元

使⽤场景: 绘制图形时, 可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵.使⽤纹理单元来进行颜色填充.其中每个像素点的颜⾊都是从纹理中获取的。

纹理调整着色器(GLT_SHADER_TEXTURE_MODULATE)

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE, mvMatrix[16], GLfloat vColor[4], GLint nTextureUnit);

GLT_SHADER_TEXTURE_MODULATE: 存储着色器种类 - 纹理调整着色器
GLfloat mvMatrix[16]:模型4*4矩阵
GLfloat vColor[4]:颜色
GLint nTextureUnit:纹理单元

使⽤场景: 绘制图形时, 可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵。着⾊色器器将一个基本⾊乘以⼀个取自纹理单元nTextureUnit 的纹理.将颜色与纹理进行颜色混合后才填充到⽚段中。

纹理光源着色器(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF)

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vColor[4], GLint nTextureUnit);

GLT_SHADER_TEXTURE_MODULATE: 存储着色器种类 - 纹理光源着色器
GLfloat mvMatrix[16]:模型44矩阵
GLfloat pMatrix[16]:投影4
4矩阵
GLfloat vLightPos[3]:光源位置
GLfloat vColor[4]:颜色
GLint nTextureUnit:纹理单元

使⽤场景: 绘制图形时, 可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵。着⾊器将一个纹理通过漫反射照明计算进行调整(相乘)。

相关文章

网友评论

      本文标题:OpenGL 渲染流程图解析及着色器梳理

      本文链接:https://www.haomeiwen.com/subject/vqhecktx.html