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);

相关推荐