untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_3_Shader的数据接口:属性和 uniform变量

2.4 Shader的数据接口:属性和 uniform变量
    如果我们想设定一个特定的值到Shader,即为了在实例化Shader为Material时,可以通过为属性赋值达到创建具体对象的目的,我们需要在Properties块中定义自己所需要的属性。
2.4.1在Properties块中定义属性
    我们能够定义如下这些属性:
Properties{
          _MyTexture("Texture (RGB)", 2D) = "white"{ }//图片形式的属性
          _MyColor("Color of Object",Color) = (1,1,1,1)//颜色属性
          _MyCube("Environment map",Cube) = "white"{}//3D贴图,需要6张图片
          _MyVector("Vector",vector) = (1, 1, 1, 1) //4个元素的向量
          _MyFloat("Float Value",float)=1.0//浮点小数
          _MyRange("Another type of float",range(-13,14))=1.0//限定范围的浮点数
}


2.4.2通过图形界面操作属性
   在如图2.1Properties块中定义了这些属性之后,我们可以在编译器中通过图形界面来给它们赋值,
所示。

2.4.3 通过脚本操控属性
    除了图形界面之外,还能够通过脚本来读取和写入我们定义的属性。下面是个C#脚本对属性的读取操作:

public Material mat;
public Texture myPic;
public Color purple;
public Cubemap cube;
public Vector4 vec;
public float val_1;
public float val_2;


   void Update(){
      //对在Shader中定义的属性进行设置
      mat.SetTexture("_MyTexture",myPic);
      mat.SetColor("_MyColor",purple);
      mat.SetTexture("_MyCube", cube);
      mat.SetVector("_MyVector",vec);
      mat.SetFloat("_MyFloat",val_1);
      mat.SetFloat("_MyRange", val_2);
      //对在Shader中定义的属性进行读取
      myPic = mat.GetTexture("_MyTexture");
      purple =mat.GetColor("_MyColor");
      cube = (Cubemap)mat.GetTexture("_MyCube");
      vec = mat.GetVector("_MyVector");
      val_1 = mat.GetFloat("_MyFloat");
      val_2 = mat.GetFloat("_MyRange");
}


    cube属性是3D贴图是Texture 2D贴图的子类range属性则是一种限制了范围的float类型,本质和float一样。如果我们在脚本中进行操作的属性在Shader中并不存在,那么Unity只会将此操作忽略,而不会报错。

2.4.4矩阵: 不能在属性块定义的变量
       矩阵口前是不能在Properties块中定义的,我们必须首先在Shader中声明它,然后通过脚本来进行读取和写入。下面是在Shader中对一个矩阵的声明:
uniformfloat4x4 myMatrix;
下面是在脚本中对该矩阵的读取和写入。
mat.SetMatrix("myMatrix",matrix);
matrix = mat.GetMatrix("myMatrix");
2.4.5 在Cg代码中使用属性

除了Unity的固定管线因为有其特定语法之外,在Properties块中定义的属性必须在代码中再声明一次才能被使用。它们在Cg代码中的声明方式如下:
sampler2D _MyTexture;
float4 _MyColor;
samplerCUBE _MyCube;
float4 _MyVector;
float  _MyFloat;
float  _MyRange;

    除了上而提到的这些类型的变量外,还可以使用 half4、fixed4half、fixed,这两种类型的变量在空间上 比float4和float分别减少一半和又一半因此在精度问题不是很突兀的情况下可以使用它们来略微提高性能。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值