zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    学习Extjs4 (21) 简单窗口
    C#启动外部程序的几种方法以及等待外部程序关闭的方法
    linux驱动学习(3)同步、信号量和自旋锁
    andoird webiew使用有道辞典实例
    Linux程序设计——用getopt处理命令行参数(转)
    git,github在windows上的搭建
    sparc芯片验证
    睡了一下午
    UNIX/Linux里统计文件里某个字符出现的次数(转)
    linux和单片机的串口通信
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/12857682.html
Copyright © 2011-2022 走看看