设置shader中的变量
来源:互联网 发布:老九门里面的软件 编辑:程序博客网 时间:2024/05/16 17:03
1、shader代码
Shader "xxx/ddd"{ SubShader { pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" float r; float g; float b; struct xxx { float4 pos:POSITION; }; xxx vert(appdata_base data) { xxx x; x.pos = mul(UNITY_MATRIX_MVP,data.vertex); return x; } fixed4 frag():COLOR { return fixed4(r,g,b,1); } ENDCG } }}
2、C#代码
using UnityEngine;using System.Collections;public class SetColorValue : MonoBehaviour { [Range(0,1)] public float r; [Range(0, 1)] public float g; [Range(0, 1)] public float b; public void Update() { this.GetComponent<Renderer>().material.SetFloat("r", r); this.GetComponent<Renderer>().material.SetFloat("g", g); this.GetComponent<Renderer>().material.SetFloat("b", b); }}
3、效果
注意点:
1/unity的顶点和片段着色器要求vertext函数和fragment函数都要存在,否则报错。
2/顶点程序负责处理顶点,包括几何变换等。变换之后,要把顶点数据传递给片段程序。
3/顶点程序需要处理顶点,那么顶点的数据从什么地方来?由谁提供给顶点程序。
在unity shader中使用in和out以及inout关键字来表明输入或者输出,inout兼输入和输出。同时unity将一些数据已经封装好,只需要使用in作为关键字,并从封装好的数据中取出即可使用,比如在Unity\Editor\Data\CGIncludes安装目录中,有一个UnityCG.cginc文件里面的appdata_base就包含了顶点的数据。我们使用的时候只需要#include “unitycg.cginc”即可在顶点程序中使用,如下面:
void vertex(appdata_data data, out float4 pos:POSITION)
{
pos = mul(UNITY_MATRIX_MVP, data.vertex);
}
4/数据类型和语义。
数据类型用于表明变量的存储方式;在shader中还引入了一个新的东西,就是语义,它用来表明数据的用途,比如同是float4可以用于color也可用于position。
5/unity shader中不同语义相同数据类型的变量是可以赋值的。比如:
float4 pos:POSITION
float4 col:COLOR
这个pos = col或者col = pos是合法的。
6/unity shader中向量最高阶为4,比如float4,fixed4,没有float5或者fixedr5,但是有float1,float2,float3和fixed1,fixed2,fixed3。
7/如果没有out作为输出,顶点程序的输出可以采取什么方式?采取函数返回值得方式,比如:
float4 vert(appdata_base data, out float4 pos:POSITION):COLOR
{
pos = mul(UNITY_MATRIX_MVP, data.vertex);
return pos;
}
这里有两点注意,其中顶点程序用于输出处理后的顶点,所以在参数中使用out关键字修饰pos。同时,我们还可以在顶点程序中直接处理颜色信息,比如这里将pos直接返回,其语义限定为COLOR。
8/与第7条重复,即函数带上返回值,带上语义,可以代替out作为输出。
9/
//输出了一个顶点和颜色
float4 vert(appdata_base data, out float4 pos:POSITION):COLOR
{
pos = mul(UNITY_MATRIX_MVP, data.vertex);
return pos;
}
//接收两个参数一个是顶点,一个是颜色;其中顶点的输出不需要接收可以省略。
void frag(out float4 col:COLOR)
{
col = float4(1,0,0,1);
}
10/使用结构体来优化代码
struct xxx{ float4 pos:POSITION; //位置 float4 col:COLOR; //颜色};xxx vert(appdata_base data){ xxx x; x.pos = mul(UNITY_MATRIX_MVP,data.vertex); x.col = float4(1,1,0,1); return x;}float4 frag(xxx x):COLOR{ return x.col;}
11/_Object2World这个是模型到世界变换矩阵,使用这个矩阵和模型相乘:
appdata_base data;
float4 pos = mul(_Object2World, data.vertex);
这个得到了模型的世界坐标。
- 设置shader中的变量
- shader中的变量和语义
- shader中的变量的声明与定义
- Shader变量
- shader变量
- shader内置常量变量
- 【Shader】变量定义
- shader 内置变量
- unity shader 内置变量
- shader内置变量
- shader几种变量
- Shader以及Unity中的Shader
- Unity Shader:细分着色器(Tessellation Shader)在顶点与片段着色器中的写法以及各参数变量解释。
- 关于设置安装包中的默认变量
- MyEclipse中的debug设置成显示变量
- VS2015项目属性配置中的变量设置
- Shader渲染队列设置
- shader内置变量和函数
- 更新maven依赖时 项目默j2SE1.5版本
- Java树的数组简单实现
- 【求和排序问题】手机游戏LoveLive!学园偶像祭 Java编写活动小工具Medley Festival最强刷分组合计算小程序(1)
- 7个增强 PHP 程序安全函数
- 老火 给大家说两句自己简单实现秒杀思路
- 设置shader中的变量
- ACM 最小生成树 Constructing Roads
- webstorm安装
- hibernate annotation 之mappedBy 与 @JoinColumn区别
- 微信第三方登录
- ActiveMQ笔记(5):JMX监控
- 【蓝桥】算法提高 队列操作
- 自定义接口内部类的一个简单的使用(跨类传值)
- Jedis API操作Redis数据库入门