OpenGL渲染架构

- 客户端(Client)
暴露在外面的API,及我们去连接和使用的对应的操作代码 - 服务器(Server)
OpenGL的底层
Client向Server传值有三种方式
- Attributes(ins):只能传值给顶点着色器(Vertex Shader)。(顶点数据,x,y,z,w 光照坐标,投影矩阵,模型矩阵,纹理坐标(图片映射坐标))
- Uniforms:传值给顶点着色器(Vertex Shader),片元着色器(Fragment Shader)。一般用来传统一的批次(变换矩阵,通道,颜色值)
- 纹理数据(Texture Data):传值给顶点着色器(Vertex Shader),片元着色器(Fragment Shader)。
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]:投影44矩阵
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]:投影44矩阵
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]:投影44矩阵
GLfloat vLightPos[3]:光源位置
GLfloat vColor[4]:颜色
GLint nTextureUnit:纹理单元
使⽤场景: 绘制图形时, 可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵。着⾊器将一个纹理通过漫反射照明计算进行调整(相乘)。
网友评论