OpenGl固定管线各种存储着色器
OpenGl固定管线各种存储着色器
固定管线使用使用存储着色渲染,好处在于我们不要考虑到渲染中到底是顶点着色器还是片元着色器.所以我们在使用存储着色器时,不需要思考传递数据,该有那种方式传送.你只需要传递不同存储器所需要的数据到参数列表就可以了. 至于它的底层是如何实现的,并不需要关心.因为这一切它已经封装起来了.
接下来,我们总结一下常用的存储着色器的使用,各参数类型,什么情况下使用。
GLT_SHADER_IDENTITY, 单元着色器
GLT_SHADER_FLAT, 平面着色器
GLT_SHADER_SHADED, 上色着色器
GLT_SHADER_DEFAULT_LIGHT, 默认光源着色器
GLT_SHADER_POINT_LIGHT_DIFF, 点光源着色器
GLT_SHADER_TEXTURE_REPLACE, 纹理替换着色器
GLT_SHADER_TEXTURE_MODULATE, 纹理调整着色器
GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,纹理点光源着色器
GLT_SHADER_TEXTURE_RECT_REPLACE, 纹理矩形替换着色器
GLT_SHADER_LAST 上次使用的着色器
1.单位着色器:只是简单地使用默认笛卡尔坐标系(坐标范围(-1.0,1.0))。所有的片段都应用同一种颜色,几何图形为实心和未渲染的。
/* 参数1:GLT_SHADER_IDENTITY(着色器标签) 参数2:颜色值 */ shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vColor);
2.平面着色器:它将单一着色器进行了拓展。允许为几何图形变换指定一个 4 * 4 变换矩阵。经常被称为“模型视图投影矩阵”
/* 参数1:GLT_SHADER_FLAT(着色器标签) 参数2:允许变化的44矩阵 参数3:颜色* */ shaderManager.UseStockShader(GLT_SHADER_FLAT,transformPipeline.GetModelViewProjectionMatrix(),vColor);
3.上色着色器
需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_COLOR(颜色分量) 2个属性。
例如:
pyramidBatch.Color4f(0, 1, 0, 1);//设置颜色
pyramidBatch.Vertex3fv(vApex);//设置顶点
颜色值将被平滑地插入顶点之间(平滑着色)。
/* 参数1:GLT_SHADER_SHADED(着色器标签) 参数2:允许变化的44矩阵 MVP */ shaderManager.UseStockShader(GLT_SHADER_SHADED,transformPipeline.GetModelViewProjectionMatrix());
4.默认光源着色器
这种着色器,是对象产生阴影和关照的效果,可以想象为平行光照色
需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_NORMAL(表面法线)
例如:
m3dFindNormal(n, vApex, vFrontRight, vBackRight);//根据三点获取法线向量值
pyramidBatch.Normal3fv(n);//设置法线向量
pyramidBatch.Vertex3fv(vApex);//设置顶点坐标
/* 参数1:默认光源着色器 参数2:模型视图矩阵 参数3:投影矩阵 参数4:颜色值 */ shaderManager.UseStockShader(GLT_SHADER_DEFAULT_LIGHT,transformPipeline.GetModelViewMatrix(),transformPipeline.GetProjectionMatrix(),vColor);
5.点光源着色器
点光源着色器和默认光源着色器很相似,区别在于:光源位置是特定的。
同样需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_NORMAL(表面法线)
例如:
m3dFindNormal(n, vApex, vFrontRight, vBackRight);//根据三点获取法线向量值
pyramidBatch.Normal3fv(n);
pyramidBatch.Vertex3fv(vApex);//设置顶点
* 参数1:点光源着色器 参数2:模型视图矩阵 参数3:投影矩阵 参数4:视点坐标光源位置 参数5:颜色值 */ GLfloat point[4] = {1,2,3,4}; shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipeline.GetModelViewMatrix(),transformPipeline.GetProjectionMatrix(),point,vColor);
6.纹理替换着色器
着色器通过给定的模型视图投影矩阵,使用绑定到nTextureUnit(纹理单元) 指定纹理单元的纹理对几何图形进行变化。
片段颜色:是直接从纹理样本中直接获取的。
需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_TUEXTUER(纹理坐标)
例如:
pyramidBatch..MultiTexCoord2f(0, 0.0f, 0.0f);//设置纹理坐标
pyramidBatch.Vertex3fv(vApex);//设置顶点
/* 参数1:GLT_SHADER_TEXTURE_REPLACE(着色器标签) 参数2:模型视图投影矩阵 参数3:纹理层(一般给0即可) */ shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE,transformPipeline.GetModelViewProjectionMatrix(),0);
7.纹理调整着色器
在绘制图形时, 可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵.
片段颜色:将一个基本色 乘以 一个取自纹理单元 nTextureUnit的纹理,将颜色和纹理混合后填充到片元(像素点)中。
需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_TUEXTUER(纹理坐标)
例如:
pyramidBatch..MultiTexCoord2f(0, 0.0f, 0.0f);//设置纹理坐标
pyramidBatch.Vertex3fv(vApex);//设置顶点
* 参数1: 存储着?器种类-纹理调整着?器 参数2: 模型4*4矩阵 参数3: 颜?值 参数4: 纹理单元 */ shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE,transformPipeline.GetModelViewProjectionMatrix(),vColor,0);
8.纹理点光源着色器
在绘制图形时, 可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵.
将一个基本色 乘以 一个取自纹理单元 nTextureUnit的纹理,将颜色和纹理混合后填充到片元(像素点)中。
片段颜色:着?器将一个纹理通过漫反射照明计算进?调整(相乘)。
需要设置存储着色器的GLT_ATTRIBUTE_VERTEX(顶点分量) 和 GLT_ATTRIBUTE_TUEXTUER(纹理坐标)和GLT_ATTRIBUTE_NORMAL(表面法线)
例如:
m3dFindNormal(n, vApex, vFrontRight, vBackRight);//根据三点获取法线向量值
pyramidBatch.Normal3fv(n);设置法线
pyramidBatch..MultiTexCoord2f(0, 0.0f, 0.0f);//设置纹理坐标
pyramidBatch.Vertex3fv(vApex);//设置顶点
/* 参数1:纹理光源着色器 参数2:模型举阵 参数3:投影矩阵 参数4:视觉空间中的光源位置 参数5:几何图形的基本色 参数6:将要使用的纹理单元 */ shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,transformPipeline.GetModelViewProjectionMatrix(),transformPipeline.GetProjectionMatrix(),point,vColor,0);