iOS OpenGL开发(四) - 存储着色器分类

栏目: IOS · 发布时间: 5年前

内容简介:。这两个着色器属于可编程管线范畴。那么对于固定管线中,我们还有哪一些着色器可以使用呢?接下来,这一片文章,就带领大家了解一下,存储着色器中的八大着色器。使用存储着色器,我们就必须认识一个工具类OpenGL支持多达16种可以为每个顶点设置的不同类型参数。这些参数编号从0-15,并且可以与顶点着色器中的任何制定变量相关联,存储着色器为每个变量都使用一致的内部变量命名规则和相同的属性值。里面列出了这些属性:
#前言 在OpenGL核心框架中,是没有提供任何内建渲染管线的,在提交一个集合图形进行渲染之前,必须制定一个着色器。在这篇文章中我们了解到了两个很重要的着色器:和

。这两个着色器属于可编程管线范畴。那么对于固定管线中,我们还有哪一些着色器可以使用呢?接下来,这一片文章,就带领大家了解一下,存储着色器中的八大着色器。

使用存储着色器,我们就必须认识一个 工具GLTools 。这是一个C++的工具类,其中有一个 GLShaderManager 去管理所有的存储着色器,他们能够满足进行通常渲染的基本要求。 GLShaderManager 在使用之前必须进行初始化:

shaderManager.InitializeStockShaders();
复制代码

属性

OpenGL支持多达16种可以为每个顶点设置的不同类型参数。这些参数编号从0-15,并且可以与顶点着色器中的任何制定变量相关联,存储着色器为每个变量都使用一致的内部变量命名规则和相同的属性值。里面列出了这些属性:

标识符 描述
GLT _ ATTIBUTE _ VERTEX 3分量(x, y , z)顶点位置
GLT _ ATTIBUTE _ COLOR 4分量(r, g, b, a)颜色值
GLT _ ATTIBUTE _ NORMAL 3分量(x, y , z)表面法线
GLT _ ATTIBUTE _ TEXTURE0 第一对2分量(s, t)纹理坐标
GLT _ ATTIBUTE _ TEXTURE1 第二对2分量(s, t)纹理坐标

Uniform值

这个值我想大家应该不会陌生,上一篇文章中我们有提到这个参数。其实要对几何图形进行渲染,我们需要为对象递交属性矩阵,但首先要绑定到我们想要使用的着色器程序上,并提供程序的 Uniform 值。 GLShaderManager 类就可以为我们完成这个操作。 UseStockShader 函数会选择一个存储着色器并提供这个着色器的 Uniform 值,这些工作通过一次函数调用就能完成:

GLShaderManager::UseStockShader(GLenum shader, ... ...);
复制代码

这个函数根据我们选择的着色器从堆栈中提取正确的参数,这些参数就是特定着色器要求的Uniform值。

存储着色器分类

1、单位(Identity)着色器/单元着色器

单元着色器只是简单的使用默认的 笛卡尔坐标系 。所有片段都是用的同一种颜色,几何图形为实心和未渲染的。这种着色器只使用一个属性 GLT_ATTIBUTE_VERTEXvColor 参数包含了要求的颜色。

//参数一:着色器属性 
//参数二:需要的颜色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
复制代码

2、平面着色器

平面着色器将统一着色器进行了扩展,允许为几何图形变换指定一个4 * 4变换矩阵。典型情况下这是一种左乘模型视图矩阵和投影矩阵,也就是我们常说的“ 模型视图投影矩阵 ”。这种着色器只是用一个属性 GLT_ATTIBUTE_VERTEX

//参数一:着色器属性 
//参数二:允许变化的4*4矩阵
//参数三:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);
复制代码

3、上色(Shaded)着色器

这种着色器唯一的Uniform值就是在几何图形中应用的变换矩阵。 GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_COLOR 在这种着色器中都会使用。颜色值将被平滑得插入顶点之间(这就是所谓的 平滑着色 )。

//参数一:着色器属性 
//参数二:允许变化的4*4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
复制代码

4、默认光源着色器

这种着色器通俗点讲,就是从观察者的方向发出一个平行光所产生的效果。会使对象产生阴影和光照的效果。这里需要 模型视图矩阵投影矩阵 和作为基本色的颜色值等Uniform值。所需的属性有 GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:模型视图矩阵
//参数三:投影矩阵
//参数四:颜色值
GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);
复制代码

5、点光源着色器

这个着色器跟默认光源着色器比较像,但是点光源着色器的光源位置是特定的。这种着色器接受4个Uniform值,即 模型视图矩阵投影矩阵 、视图坐标系中的光源位置和对象的基本漫反射颜色。所需的属性有 GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:模型视图矩阵
//参数三:投影矩阵
//参数四:视点坐标光源位置
//参数五:颜色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16],GLfloat vLightPos[3], GLfloat vColor[4]);
复制代码

6、纹理替换矩阵

着色器通过给定的模型视图投影矩阵,使用绑定到nTextureUnit指定的纹理单元的纹理对几何图形进行变换。片段颜色是直接从纹理样本中直接获取的。所需的属性有 GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:投影矩阵
//参数三:需要相乘的纹理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit);
复制代码

7、纹理调整着色器

这种着色器将一个基本色乘以一个取自纹理单元的TextureUnit的纹理。所需的属性有 GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0

//参数一:着色器属性 
//参数二:投影矩阵
//参数三:颜色
//参数四:需要相乘的纹理
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit);
复制代码

8、纹理光源着色器

这种着色器将一个纹理通过漫反射照明计算进行调整(相乘),光线在视觉空间中的位置是给定的。这种着色器接受5个Uniform值,即 模型视图矩阵投影矩阵 、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。所需的属性有 GLT_ATTIBUTE_VERTEXGLT_ATTIBUTE_TEXTURE0GLT_ATTIBUTE_NORMAL

//参数一:着色器属性 
//参数二:投影矩阵
//参数三:视图空间中的光源位置
//参数四:几何图形的基本色
//参数五:将要使用的纹理单元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit);
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

万万没想到

万万没想到

万维钢(同人于野) / 电子工业出版社 / 2014-10-1 / 39.80元

本书精选了万维钢老师的文章和书评,以“用理工科思维理解世界”为导向。作者常用有趣的实验、数据来解读感性的事物,其理工科思维涉及行为经济学、认知心理学、社会学、统计学、物理等许多学科,以前沿的科学视角解读生活,为人们提供了认知的新方法。读完本书相当于精读了十几本经过筛选 、再创作及通俗化处理的巨著,不仅有趣还十分有营养。一起来看看 《万万没想到》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具