关于Unity中Shader的使用
在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示。
通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader
Unity坐标系转换
1: transform.localToWorldMatrix 局部转世界的矩阵;
2: transfrom.worldToLocalMatrix 世界坐标转局部坐标矩阵;
MultiplyPoint, MultiplyPoint3x4 MultiplayVector 来进行坐标变换;
4: shader中 左乘_World2Object矩阵来实现世界坐标转局部坐标变换;
5: shader中左乘_Object2World矩阵来实现局部转世界的转换;
6: UNITY_MATRIX_MV 基本变换矩阵 x 摄像机矩阵;
7: UNITY_MATRIX_MVP 基本变换矩阵x摄像机矩阵x投影矩阵;
8: UNITY_MATRIX_V 摄像机矩阵;
9: UNITY_MATRIX_P 投影矩阵;
10: UNITY_MATRIX_VP摄像机矩阵x投影矩阵;
11: UNITY_MATRIX_T_MV (基本变换矩阵 x 摄像机矩阵) 转置矩阵;
12: UNITY_MATRIX_IT_MV(基本变换矩阵 x 摄像机矩阵) 的逆转置矩阵;
13: UNITY_MATRIX_TEXTURE0 纹理变化矩阵;
GPU管道流水线
1: 主要的运算在GPU上计算,CPU插入指令;
2: 大致流程:

顶点着色器和片元着色器
1: 控制灵活,但不能参与光照计算;
2: 在着色器中插入Cg代码段,编写在CGPROGRAM 与 ENDCG之间;
3: 编译指令: #pragma控制 着色器代码编译。每一个Shader都有入口函数
#pragma vertex name 将名称为name的函数编译为顶点着色器;
#pragma fragment name 将名称为name的函数编译为片元着色器;
4: 参数和返回值有语义修饰
常用语义修饰
1:POSITION : 位置
2:TANGENT : 切线
3: NORMAL: 法线
4: TEXCOORD0: 第一套纹理
5: TEXCOORD1: 第二套纹理
6: TEXCOORD2: 第三套纹理
7: TEXCOORD3: 第四套纹理
8: COLOR: 颜色
Shader实例
1.创建好Unity工程目录
2.创建一个Cube物体
3.在resources文件夹下创建一个shaders文件夹
4.进入shaders,create---->Shader---->Standard Surface Shader---->重命名MyShader
5.打开MyShader
Shader "Custom/MyShader" {
// 绑定到编辑器上去, shader程序里面可以使用;
Properties {
_Color ("Color", Color) = (,,,)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(,)) = 0.5
_Metallic ("Metallic", Range(,)) = 0.0
}
SubShader {
Pass {
CGPROGRAM // 插入我们的Cg代码段开始标志
// 指定哪段代码是顶点shader,把my_vertex作为顶点shader的入口
#pragma vertex my_vertex
// : 语义说明,怎么获得上一个工位的参数---->语义bind,告诉上一个工位我需要position参数,那么上一个工位就会给我们传这个参数,这里就可以使用
float4 my_vertex(float4 v : POSITION) : POSITION {
return mul(UNITY_MATRIX_MVP, v);
}
// 指定哪段代码是片元着色shader
#pragma fragment my_frag
fixed4 my_frag() : COLOR{
return fixed4(1.0, , , 1.0);
}
ENDCG // 插入我们的Cg代码段结束标志
}
}
FallBack "Diffuse"
}
6.在shaders文件夹下创建一个材质Material,命名为MyShader
7.在材质球的右上角的shader选项选择Custom---->MyShader
8.把材质球拖进Cube的材质属性里面
注意:
每个Shader有输入和输出,盒子有对应几个函数,函数有输入参数外加返回值的输出。
关于Unity中Shader的使用的更多相关文章
- 关于Unity中Shader的基础认识
Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...
- 关于Unity中Shader的内置值
Unity provides a handful of builtin values for your shaders: things like current object's transforma ...
- Unity中Shader和AssetBundle结合使用的注意事项
之前遇到了一件事情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本 下面是unity开发的一些 ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
- 解读Unity中的CG编写Shader系列七(不透明度与混合)
转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...
- 解读Unity中的CG编写Shader系列八(镜面反射)
转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...
- 解读Unity中的CG编写Shader系列三
转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...
随机推荐
- Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别
Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别 通常来说函数调用要用到的两条基本的指令:”CALL”指令和”RET”指令.”CALL”指令将当前的指令指针(这个指 ...
- Modelsim se仿真Xilinx IPcore
Modelsim se仿真Xilinx IPcore 方法:先写好do文件常规框架,根据modelsim报错再添加ise IP核库仿真文件.注:记得添加并仿真glbl.v全局控制仿真文件到sim/is ...
- 【Unity】11.4 车轮碰撞体(Wheel Collider)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 车轮碰撞体 (Wheel Collider)专门用于创建汽车或其他移动交通工具. 车轮碰撞体是一种针对地面车辆的特殊碰撞 ...
- 【Unity】2.7 检视器(Inspector)
分类:Unity.C#.VS2015 创建日期:2016-03-31 一.简介 Unity中的游戏是以包含网格.脚本.声音或灯光 (Lights) 等其他图形元素的多个游戏对象 (GameObject ...
- Android学习之Design Support Library中TextInputLayout的使用
今天学习了一个Android Design Support Library 中的TextInputLayout控件,感觉还不错,较之以往的Editetxt,多了几分灵活性,使用也非常easy,故此给大 ...
- HTML5学习笔记(十一):JavaScript基础
JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中: <head> <script> alert('He ...
- SVN四部曲之SVN设置详解深入
想知道不同的设置是干什么用的,你只需将鼠标指针在编辑框/选项框上停留一秒钟...一个帮助提示气泡就会弹出来. 常规设置 图 4.68. 设置对话框,常规设置页面 这个对话框允许你指定自己喜欢的语言,同 ...
- 解析Delphi 窗口置顶,及非主窗口置顶
方法一: procedure TForm1.Button2Click(Sender: TObject);begin Form2.Show; Application.NormalizeTopMosts; ...
- bzoj1103【POI2007】大都市meg
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1544 Solved: 776 [Submit][St ...
- 在dos下查看memcache运行状态
在dos命令行下查看memcache运行状态,操作很简单,只需cmd下输入:telnet IP 端口号->stats ,如果本机器不支持telnet还需安装,可以百度telnet的安装方法. ...