2.4 Shader的数据接口:属性和 uniform变量

    如果我们想设定一个特定的值到Shader,即为了在实例化Shader为Material时,可以通过为属性赋值达到创建具体对象的目的,我们需要在Properties块中定义自己所需要的属性。
2.4.1在Properties块中定义属性

    我们能够定义如下这些属性:

[csharp] view
plain
 copy

  1. Properties{
  2. _MyTexture("Texture (RGB)", 2D) = "white"{ }//图片形式的属性
  3. _MyColor("Color of Object",Color) = (1,1,1,1)//颜色属性
  4. _MyCube("Environment map",Cube) = "white"{}//3D贴图,需要6张图片
  5. _MyVector("Vector",vector) = (1, 1, 1, 1) //4个元素的向量
  6. _MyFloat("Float Value",float)=1.0//浮点小数
  7. _MyRange("Another type of float",range(-13,14))=1.0//限定范围的浮点数
  8. }

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


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

[csharp] view
plain
 copy

  1. public Material mat;
  2. public Texture myPic;
  3. public Color purple;
  4. public Cubemap cube;
  5. public Vector4 vec;
  6. public float val_1;
  7. public float val_2;
  8. void Update(){
  9. //对在Shader中定义的属性进行设置
  10. mat.SetTexture("_MyTexture",myPic);
  11. mat.SetColor("_MyColor",purple);
  12. mat.SetTexture("_MyCube", cube);
  13. mat.SetVector("_MyVector",vec);
  14. mat.SetFloat("_MyFloat",val_1);
  15. mat.SetFloat("_MyRange", val_2);
  16. //对在Shader中定义的属性进行读取
  17. myPic = mat.GetTexture("_MyTexture");
  18. purple =mat.GetColor("_MyColor");
  19. cube = (Cubemap)mat.GetTexture("_MyCube");
  20. vec = mat.GetVector("_MyVector");
  21. val_1 = mat.GetFloat("_MyFloat");
  22. val_2 = mat.GetFloat("_MyRange");
  23. }

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

2.4.4矩阵: 不能在属性块定义的变量
      矩阵口前是不能在Properties块中定义的,我们必须首先在Shader中声明它,然后通过脚本来进行读取和写入。下面是在Shader中对一个矩阵的声明:

[csharp] view
plain
 copy

  1. uniformfloat4x4 myMatrix;

下面是在脚本中对该矩阵的读取和写入。

[csharp] view
plain
 copy

  1. mat.SetMatrix("myMatrix",matrix);
  2. matrix = mat.GetMatrix("myMatrix");

2.4.5 在Cg代码中使用属性

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

[csharp] view
plain
 copy

  1. sampler2D _MyTexture;
  2. float4 _MyColor;
  3. samplerCUBE _MyCube;
  4. float4 _MyVector;
  5. float  _MyFloat;
  6. float  _MyRange;

除了上而提到的这些类型的变量外,还可以使用half4、fixed4和half、fixed,这两种类型的变量在空间上比float4和float分别减少一半和又一半,因此在精度问题不是很突兀的情况下可以使用它们来略微提高性能。

最新文章

  1. 为什么C#中ref和out 关键字 ?
  2. Codeforces #380 div2 C(729C) Road to Cinema
  3. 10 个学习iOS开发的最佳网站(转)
  4. Codeforces Round #257 (Div. 2) A题
  5. android坐标
  6. struts2视频学习笔记 01-02
  7. 决策树之ID3算法实现(python)
  8. [置顶] 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……
  9. redhat在线安装chrome浏览器
  10. iOS开发中如何创建多个target
  11. MySQL复制进阶
  12. koa 写简单服务
  13. sqlplus导入数据
  14. Linux C++开发学习(一)
  15. 2-微信小程序开发(开发界面说明,按钮点击切换显示内容)
  16. 3. 使用vue-cli创建项目
  17. C# 敏捷1
  18. MMIO----Wav格式文件解析
  19. JAVA springmvc 转换器
  20. restful知识点之六rest-framework组件流程图

热门文章

  1. mysql错误:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated
  2. Android RelativeLayout相对布局
  3. Linux线程的几种结束方式
  4. Mac OS 配置Maven
  5. 作业:xml练习1
  6. ffmpeg截取视频
  7. Use trained sklearn model with pyspark
  8. Mysql学习_02_mysql数据导入导出
  9. listen 59
  10. 使用top命令查看系统状态