内容简介:。这两个着色器属于可编程管线范畴。那么对于固定管线中,我们还有哪一些着色器可以使用呢?接下来,这一片文章,就带领大家了解一下,存储着色器中的八大着色器。使用存储着色器,我们就必须认识一个工具类OpenGL支持多达16种可以为每个顶点设置的不同类型参数。这些参数编号从0-15,并且可以与顶点着色器中的任何制定变量相关联,存储着色器为每个变量都使用一致的内部变量命名规则和相同的属性值。里面列出了这些属性:
。这两个着色器属于可编程管线范畴。那么对于固定管线中,我们还有哪一些着色器可以使用呢?接下来,这一片文章,就带领大家了解一下,存储着色器中的八大着色器。
使用存储着色器,我们就必须认识一个 工具 类 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_VERTEX
。 vColor
参数包含了要求的颜色。
//参数一:着色器属性 //参数二:需要的颜色 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_VERTEX
和 GLT_ATTIBUTE_COLOR
在这种着色器中都会使用。颜色值将被平滑得插入顶点之间(这就是所谓的 平滑着色
)。
//参数一:着色器属性 //参数二:允许变化的4*4矩阵 GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]); 复制代码
4、默认光源着色器
这种着色器通俗点讲,就是从观察者的方向发出一个平行光所产生的效果。会使对象产生阴影和光照的效果。这里需要 模型视图矩阵
、 投影矩阵
和作为基本色的颜色值等Uniform值。所需的属性有 GLT_ATTIBUTE_VERTEX
和 GLT_ATTIBUTE_NORMAL
。
//参数一:着色器属性 //参数二:模型视图矩阵 //参数三:投影矩阵 //参数四:颜色值 GLShaderManager::UseStockShader(GLT_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]); 复制代码
5、点光源着色器
这个着色器跟默认光源着色器比较像,但是点光源着色器的光源位置是特定的。这种着色器接受4个Uniform值,即 模型视图矩阵
、 投影矩阵
、视图坐标系中的光源位置和对象的基本漫反射颜色。所需的属性有 GLT_ATTIBUTE_VERTEX
和 GLT_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_VERTEX
和 GLT_ATTIBUTE_NORMAL
。
//参数一:着色器属性 //参数二:投影矩阵 //参数三:需要相乘的纹理 GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvpMatrix[16], GLint nTextureUnit); 复制代码
7、纹理调整着色器
这种着色器将一个基本色乘以一个取自纹理单元的TextureUnit的纹理。所需的属性有 GLT_ATTIBUTE_VERTEX
和 GLT_ATTIBUTE_TEXTURE0
。
//参数一:着色器属性 //参数二:投影矩阵 //参数三:颜色 //参数四:需要相乘的纹理 GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvpMatrix[16], GLfloat vColor, GLint nTextureUnit); 复制代码
8、纹理光源着色器
这种着色器将一个纹理通过漫反射照明计算进行调整(相乘),光线在视觉空间中的位置是给定的。这种着色器接受5个Uniform值,即 模型视图矩阵
、 投影矩阵
、视觉空间中的光源位置、几何图形的基本色和将要使用的纹理单元。所需的属性有 GLT_ATTIBUTE_VERTEX
、 GLT_ATTIBUTE_TEXTURE0
和 GLT_ATTIBUTE_NORMAL
。
//参数一:着色器属性 //参数二:投影矩阵 //参数三:视图空间中的光源位置 //参数四:几何图形的基本色 //参数五:将要使用的纹理单元 GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DEFF, GLfloat mvMatrix, GLfloat mvpMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4], GLint nTextureUnit); 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- OpenGL/OpenGL ES 渲染流程以及固定存储着色器
- Web 高级着色语言(WHLSL) - 为WebGPU设计的Web图形着色语言
- OpenGL ES 入门之旅--OpenGL ES顶点着色器和片元着色器
- WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
- OpenGL/OpenGL ES入门: 顶点着色器与片元着色器(OpenGL过渡OpenGL ES)
- [译]背景:着色的物理和数学(3)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。