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分别减少一半和又一半,因此在精度问题不是很突兀的情况下可以使用它们来略微提高性能。

代码修改shader Properties uniform变量的更多相关文章

  1. u-boot移植(十三)---代码修改---裁剪及环境变量 一

    一.内核裁剪 内核的裁剪首先就是修改我们的配置文件,即 include/configs/jz2440.h 文件,里面定义的很多宏,我们也许用不上的就要去掉. /* * (C) Copyright 20 ...

  2. u-boot移植(十三)---代码修改---裁剪及环境变量 二

    一.错误处理 上一节遇到一个错误: print一下: 发现我们在jz2440.h中静态写的网络参数都没有写进去. dm9000 address not set. dm9000的地址未设置. 这里对应两 ...

  3. shader三种变量类型(uniform,attribute和varying)

    uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用.(相当于一个被vertex和fragment shader共享的全局变量) ...

  4. OpenGL红宝书例子2.2 uniform变量的使用

    1. 简单介绍一下OpenGL可编程渲染管线的流程 顶点着色 --> 细分着色 --> 几何着色 --> 片元着色 --> 计算着色 一般我们主要参与的阶段是顶点着色和片元着色 ...

  5. OpenGL编程逐步深入(五)Uniform 变量

    准备知识 在这个教程中我们会遇到一种新的Shader变量类型,即uniform变量.attribute(属性)变量和uniform变量的不同之处在于attribute 变量中包含顶点的具体数据,当每次 ...

  6. CSharpGL(33)使用uniform块来优化对uniform变量的读写

    CSharpGL(33)使用uniform块来优化对uniform变量的读写 +BIT祝威+悄悄在此留下版了个权的信息说: Uniform块 如果shader程序变得比较复杂,那么其中用到的unifo ...

  7. SharePoint开发 - 使用Session(代码修改webconfig)

    博客地址 http://blog.csdn.net/foxdave SharePoint启用Session可以使用Powershell,戳这里:可以修改webconfig. 本篇叙述的重点是通过fea ...

  8. u-boot移植(十二)---代码修改---支持DM9000网卡

    一.准备工作 1.1 原理图 CONFIG_DM9000_BASE 片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定. 在三星2440的DATASHEET中memory ...

  9. Spring在代码中获取properties文件属性

    这里介绍两种在代码中获取properties文件属性的方法. 使用@Value注解获取properties文件属性: 1.因为在下面要用到Spring的<util />配置,所以,首先要在 ...

随机推荐

  1. php微信支付测试开发(流程已通)

    必要条件: appid //公众号后台开发者中心获得(和邮件内的一样)   mchid//邮件内获得  key//商户后台自己设置  appsecret //公众号开发者中心获得 两个证书文件,邮件内 ...

  2. python多进程编程常用到的方法

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程.python提供了非常好用的多进程包Multiprocessing,只需要定义 ...

  3. Java基础教程:多线程基础(4)——Lock的使用

    Java基础教程:多线程基础(4)——Lock的使用 快速开始 Java 5中Lock对象的也能实现同步的效果,而且在使用上更加方便. 本节重点的2个知识点是:ReentrantLock类的使用和Re ...

  4. Data Structure Binary Search Tree: Inorder Successor in Binary Search Tree

    struct node { int val; node *left; node *right; node *parent; node() : val(), left(NULL), right(NULL ...

  5. ubuntu16.04下安装wordpress

    安装过程 http://blog.topspeedsnail.com/archives/4635 http://blog.topspeedsnail.com/archives/4646 碰到的问题 1 ...

  6. webpack为什么加载不了css?

    原文地址: https://segmentfault.com/q/1010000005099261 这个app是用react写的. webpack的loader设置是这样的 module:{ load ...

  7. CodeForces - 311B:Cats Transport (DP+斜率优化)

    Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...

  8. js实现股票实时刷新数据

    近来学习炒股,免不了上班时间看盘,总不能光明正大的用电脑看行情,一直盯着手机影响也不好,容易引起“关注”. 所以就想自己做一个网页来达到看盘的目的,一个只显示几个关键数字的网页肯定不会引起怀疑.有想法 ...

  9. Ubuntu Hadoop环境搭建(Hadoop2.6.5+jdk1.8.0_121)

    1.JDK的安装 2.配置hosts文件(这个也要拷贝给所有slave机,scp /etc/hosts root@slave1:/etc/hosts) gedit /etc/hosts 添加: 122 ...

  10. [xdoj1233]Glory and LCS

    题意:求两个排列的最长公共子序列n<=1e5 解题关键:转化为LIS. 最长公共子序列 的 nlogn 的算法本质是 将该问题转化成 最长增序列(LIS),因为 LIS 可以用nlogn实现,所 ...