zoukankan      html  css  js  c++  java
  • 关于GLSL中语法和调用规则的一些记录

          glsl是什么就不多说了。这里只介绍一下glsl中一些限定符。

      glsl中包含两类具有定义性质的符号,一类是和c++中定义变量的一样的符号,用来说明存放数据的类型,如float,int,bool。还有一类是的功能类似于c++中的private,protect,public,是用来说明变量被访问的方式,glsl中常用的限定符包含三个,uniform,attribute 以及 varying,称为限定符(还有一个const,就不多说了)。

          uniform限定了该变量是随着图元变化而变化的,也就是说在一个图元被光栅化过程中是不会变的。

      attribute限定了该变量是随着顶点变化而变化的,如,一个三角形图元,三个顶点的都可以绑定不同的attribute属性,但是三个顶点只能使用一个uniform属性。

      其中,attribute只能在 vertex shader中使用,而不能在 fragment shader中使用。uniform能在两种类型的shader中使用。但是,着两种限定符修饰的变量都是只读,不可写的。

      varying变量比较特殊了,这个限定符号修饰的变量作用主要是在vertex shader 和 fragment shader 之间进行传输数据的,在vertex shader中是读写都没有问题,但是在fragment  shader中只读不可写。并且,在从vertex shader到 fragment shader之间,要被固定流水线进行插值(个人感觉是在光栅化阶段进行插值的),并且插值方式采用的是透视校正方式完成的(和透视纹理映射一样),而不是线性插值。所以,varying变量不但被vertex shader改变,而且被固定流水线改变。

         可以看出来,三种限定符从图元角度来看是越来越精细的,uniform是对整个图元(面片)而言,attribute是对图元(面片)上的几个关键点而言,varying则精细到了图元(面片)中的任何一个点。同时,在glsl中也使用上述三种限定符定义了一些内置的变量,免去了很多麻烦。

         这里提一下,在glsl中定义了两个gl_color变量,一个是attribute修饰,只在vertex shader中使用,只读。还有一个是varying修饰的,但是只在fragment shader中使用,所以不冲突,并且varying修饰的gl_color是由gl_frontColor 和gl_backColor自动转变的,而gl_frontColor 和gl_backColor又是由attribut gl_color自动转化的。(http://blog.sina.com.cn/s/blog_41630e7e01008uu6.html)

         对于opengl和glsl的交互中,要设定uniform的值,要在调用gluseprogram以后才可以设定,但是在编译链接glsl程序以后就可以开始获得uniform类型变量的地址了。

       

    struct gl_LightSourceParameters  
    {  
        vec4 ambient;  
        vec4 diffuse;  
        vec4 specular;  
        vec4 position;  
        ...  
    };  
      
    uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];  

        上面时glsl中对光源的内置定义,其中,光源的方向是在摄像机坐标系下定义的,如果从世界坐标系到摄像机坐标系转化矩阵的左上角3x3矩阵是正交矩阵,例如使用glulookat设置,则光源的方向已经被opengl归一化了,否则还要手动归一化。

  • 相关阅读:
    LNMP编译
    数据库(二)tab补全功能,使数据库支持简体中文,日志管理,备份脚本
    MySQL数据库(一)编译安装、安装后优化操作及超户忘记数据库密码的解决方法
    awk简题
    NFS
    WCF 传递数据量大时的报错处理
    Windows服务工程创建、部署
    反射创建BLL层控制器
    php yii环境简易配置
    php 搭建mvc框架
  • 原文地址:https://www.cnblogs.com/BlackWalnut/p/4246029.html
Copyright © 2011-2022 走看看