untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_3_Shader的数据接口:属性和 uniform变量
来源:互联网 发布:程序员考试时间 编辑:程序博客网 时间:2024/05/16 07:13
2.4 Shader的数据接口:属性和 uniform变量
如果我们想设定一个特定的值到Shader,即为了在实例化Shader为Material时,可以通过为属性赋值达到创建具体对象的目的,我们需要在Properties块中定义自己所需要的属性。
2.4.1在Properties块中定义属性
我们能够定义如下这些属性:
2.4.2通过图形界面操作属性
在如图2.1Properties块中定义了这些属性之后,我们可以在编译器中通过图形界面来给它们赋值,
所示。
2.4.3 通过脚本操控属性
除了图形界面之外,还能够通过脚本来读取和写入我们定义的属性。下面是个C#脚本对属性的读取操作:
cube属性是3D贴图,是Texture 2D贴图的子类,range属性则是一种限制了范围的float类型,本质和float一样。如果我们在脚本中进行操作的属性在Shader中并不存在,那么Unity只会将此操作忽略,而不会报错。
2.4.4矩阵: 不能在属性块定义的变量
矩阵口前是不能在Properties块中定义的,我们必须首先在Shader中声明它,然后通过脚本来进行读取和写入。下面是在Shader中对一个矩阵的声明:
除了Unity的固定管线因为有其特定语法之外,在Properties块中定义的属性必须在代码中再声明一次才能被使用。它们在Cg代码中的声明方式如下:
除了上而提到的这些类型的变量外,还可以使用half4、fixed4和half、fixed,这两种类型的变量在空间上比float4和float分别减少一半和又一半,因此在精度问题不是很突兀的情况下可以使用它们来略微提高性能。
如果我们想设定一个特定的值到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、fixed4和half、fixed,这两种类型的变量在空间上比float4和float分别减少一半和又一半,因此在精度问题不是很突兀的情况下可以使用它们来略微提高性能。
0 0
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_3_Shader的数据接口:属性和 uniform变量
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_1_Unity通过ShaderLab 来组织Shader
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_2_Unity中Shader的3种形态
- untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
- untiy 3d ShaderLab第 1 章Shader(着色器)的概念和在 3D 游戏中的作用
- Shader的数据接口:属性和uniform变量
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第4章_基本的光照模型
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第9章_2_球体阴影(二) 阴影的淡入/淡出
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_1_不同LightMode 被选择的顺序
- Unity中Shader的3种形态
- untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd
- untiy 3d ShaderLab_第8章_2_在效果和性能间进行权衡
- unity5.3.3 no pc,mac&linux standalone
- cf273C. Primes on Interval【二分】
- Java 设计模式- 外观模式
- 恋恋加密算法解析
- TimesTen访问Oracle的口令存在哪里(ttCacheUidPwdSet还是OraclePWD)
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_3_Shader的数据接口:属性和 uniform变量
- 在Java中如何高效判断数组中是否包含某个元素
- shiro多角色访问同一个url
- PAT-B 1006. 换个格式输出整数
- APP创意IDEA记录
- 文章标题
- 浅谈Solr和ElasticSearch建索引性能优化策略
- 17、IO流-File操作
- leetcode——173——Binary Search Tree Iterator