zoukankan      html  css  js  c++  java
  • 【Unity Shader】---数据类型和关键字

    一、基本数据类型:Cg支持7种基本的数据类型

      1、float,32位浮点数据,一个符号位。浮点数据类型被所有的图形接口支持;

      2、half,16位浮点数据;

      3、int,32位整形数据

      4,fixed,12位定点数,

      5、bool,布尔数据,被所有的图形接口支持;

      6、sampler*,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。

    二、内置的数据类型

            基于基础数据类型,如float3,表示float类型的三维向量;同理,bool2表示布尔类型的二维向量。

    注:向量最长不能超过四元,如float5  vector;//编译错误

    向量的赋值:

        float2 a=float(1.0,1.0);       //编译通过

                  float2 a=float(1.0f,1.0f);     //编译错误

                  float3 b=float(a,0.0);          //编译通过

    矩阵数据类型:

        float1X1 m1;                      //即float m1,一维矩阵

                  float3X4 m34                    //3*4阶矩阵

    注:X是字符,不是乘号,最大的维数为4*4阶,矩阵的初始化 float 2*2 m22={1.0,2.0,3.0,2.3};

    float3 x和floatx[3]是不同的,前者为向量是内置的数据类型,而数组则是一种数据结构,不是内置的数据类型。

    三、类型转换

           Cg中的类型转换有强制转换和隐式转换;如果是隐式转换则数据类型从低精度向高精度转换。如:

           float a=1.0;    half b=2.0;   loat c=a+b;      //等价于float c=a+(float)b;

           Cg语言中可以对常量数据加上类型后缀表示该数据类型的数据,如:

           float a=1.0h;     //1.0h为half类型常量数据

      这样的后缀类型有三种:

       f:表示float;

       h:表示half;

       x:表示fixed;

    四、Swizzle操作符

            Cg语言中的其他操作符和高级CPU语言C++类似,包括关系操作符、逻辑操作符和位移操作符以及条件操作符。而Swizzle操作符是Cg语言中特有的,它可以将一个向量的成员取出组成一个新的向量。对于坐标或者角度等其他多维向量,Swizzle操作符(.)后接x、y、z、w分别表示原始向量的第一个、第二个、第三个和第四个元素;同样,对于颜色可以后接r、g、b和a来表示同样的索引。

    例如:

                  float4(a,b,c,d).xwz  等价于 float(a,d,c)

                  float4(a,b,c,d).xxy  等价于 float(a,a,b)

    注:Swizzle操作符只对结构体和向量使用,不能对数组使用。

    五、输入数据关键字:Cg中输入数据流一般分为两类

           1、varying 参数:在Cg程序中通过语义进行绑定变量, Cg语言提供了一组语义词,用以表示参数是由顶点的那些数据初始化的,一旦这个变量使用了语义词进行绑定,那么这个变量值被初始化的同时也意味着它有了特殊的含义,如表示位置、法线等含义。语义提供了一种使用随顶点变化或随片段变化而变化的值来初始化Cg程序参数的方法,这些数据都是从应用程序输入到GPU的数据,如顶点位置、法向量、纹理坐标数据等。

           2、Uniform 参数:Uniform是用来限制一个变量的初始值的来源,当声明一个变量为Uniform类型的时候,表示这个变量的初始值来自于外部的其他环境。除了获取初始值的这点之外,Uniform关键字声明的变量和其他变量是完全一样的。通常用Uniform来定义一些与三维渲染有关的离散信息数据,并通常不会随着图元信息的变化而变化,如材质对光的反射信息。Uniform表示一个参数,通常使用     uniform表示函数的形参,不能定义一个uniform表示的局部变量。

           Unity的内置Uniform输入参数如下:

      uniform float4 _Time, _SinTime, _CosTime; // 时间量

      uniform float4 _ProjectionParams; // x = 1 or -1 (如果投影翻转就是-1)

      // y = 近平面; z = 远平面; w = 1/远平面

      uniform float4 _ScreenParams; // x = width; y = height; z = 1 +1/width; w = 1 + 1/height

         uniform float3_WorldSpaceCameraPos;

      uniform float4x4 _Object2World; //模型矩阵

      uniform float4x4 _World2Object; // 模型矩阵的逆

      uniform float4 _LightPositionRange; // xyz = pos, w = 1/range

      uniform float4 _WorldSpaceLightPos0; // 光源的位置和方向

      uniform float4x4 UNITY_MATRIX_MVP; // 模型视图投影矩阵

      uniform float4x4 UNITY_MATRIX_MV; // 模型视图矩阵

      uniform float4x4 UNITY_MATRIX_V; // 视图矩阵

      uniform float4x4 UNITY_MATRIX_P; // 投影矩阵

      uniform float4x4 UNITY_MATRIX_VP; // 视图投影矩阵

      uniform float4x4 UNITY_MATRIX_T_MV; // 模型视图矩阵的转置矩阵

      uniform float4x4 UNITY_MATRIX_IT_MV; // 模型视图矩阵的逆矩阵的转置矩阵

      uniform float4x4 UNITY_MATRIX_TEXTURE0; // 贴图纹理矩阵

      uniform float4x4 UNITY_MATRIX_TEXTURE1; //贴图纹理矩阵

      uniform float4x4 UNITY_MATRIX_TEXTURE2; //贴图纹理矩阵

      uniform float4x4 UNITY_MATRIX_TEXTURE3; //贴图纹理矩阵

      uniform float4 UNITY_LIGHTMODEL_AMBIENT; // 环境色

    六、输入输出

           对于程图形渲染管线,可编程控制的部分只有两个,顶点着色器和片段着色器。对于编程控制这两个部分,首要的任务就是要怎么给它们传参数。Cg语言的参数传递同样也有“值传递”和“引用传递”之分。因为GPU不支持指针,所以Cg语言采用了如下的方式来修辞参数传递:

         1、in:修辞一个形参只是用于输入,进入函数体时被初始化,且该形参值的改变不会影响实参值,传递方式为值传递。

         2、out:修辞一个形参只是用于输出,进入函数体时没有被初始化,一般为函数的返回值。

         3、inout:修辞一个形参即用于输入也用于输出,这是典型的引用传递。

     
  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/nanwei/p/7277417.html
Copyright © 2011-2022 走看看