• 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);
  • 相关阅读:
    Educational Codeforces Round 86 (Rated for Div. 2) D. Multiple Testcases
    Educational Codeforces Round 86 (Rated for Div. 2) C. Yet Another Counting Problem
    HDU
    HDU
    HDU
    HDU
    Good Bye 2019 C. Make Good (异或的使用)
    Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam
    codeforces 909C. Python Indentation
    codeforces1054 C. Candies Distribution
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/12857682.html
Copyright © 2020-2023  润新知