Unity3d Shader
Unity3d Shader 预览
Surface Shader
主要用来实现光照相关处理,可能更简洁。
Vertex and Fragment Shader
如果不与光照交互, 则可以用这个shader,更录活
fixed function shaders
固定shader主要用于老旧卡
ShaderLab
不管写哪种shader,最终通过shaderLab实现,其组织结构如下:
Shader "MyShader" {
Properties{
_MyTexture ("My Texture",2D) = "white" {}
// other properties like colors or vectors go here as well
}
SubShader{
// here goes the 'meat' of your
// - surface shader or
// -vertex and fragment shader or
// -fixed function shader
}
SubShader{
// here goes a simpler version of the subshader above that can run older graphic cards
}
}
开始以下学习前,先简单了解一下shaderlab指南
======================================================================
ShaderLab 语法: Shader
语法:
Shader "名字" {[Properties] Subshaders [Fallback]}
[]--可选项目
Properties
Shader可以有多个属性(properties),每一个属性都显示在Unity的inspector. 如颜色,贴图,或者任意值
Subshaders & Fallback
每个shader包含多个子shader, 至少包含有一个。当加载shader时, Unity会遍历所有子shader.从上往下选择第一个可以支持的。 如果没有可以支持的, Unity会试着用Fallback shader.
如下就是一个最简单的shader
// colored vertex lighting
Shader "Simple colored lighting" {
// a signle color property
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// define one subshader
SubShader{
Pass {
Material{
Diffuse [_Color]
}
Lighting On
}
}
}
subshader中包含了一个通道(Pass), 它开启了顶点光,并设置基本材质。
ShaderLab 语法:Properties
语法:
Properties {Property [Property ...] }
定义 属性块,位于括号中的定义如下:
Float Range
name ("diplay name", Range(min, max)) = number
Color
name ("diplay name", Color) = (number, number, number, number)
Texture 2D
name ("diplay name", 2D) = "name" { options }
Rectangle
name ("diplay name", Rect) = "name" { options }
Cubemap
name ("display name", Cube) = "name" {options}
Float
name ("display name", Float) = number
Vector
name ("display name", Vector) = (number, number, number, number)
例子如下:
Properties {
// properties for water shader
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
贴图选项
贴图属性的选项位花括号中,是可选的,可选项目如下:
1.TexGen 模式,自动贴图坐标生成模式。可以为ObjectLnear, EyeLinear,Shperemap, CubeReflect,CubeNormal之一。这些对应于OpenGL中相应的texgen模式。
ShaderLab 语法:SubShader
语法:
SubShader { [Tags] [CommonState] Passdef [Passdef ...] }
一个SubShader可以定义一组渲染通道,可选设置共同状态针对所有通道,也可以指定标签
当Unity确实使用那个SubShader时,它会用该Subshader每个通道一一给对象进行渲染,每一次渲染是一个比较昂贵的操作。尽可能的少用通道。
例子如下:
// ...
SubShader {
Pass {
Lighting Off
SetTexture [_MainTex] {}
}
}
// ...
ShaderLab 语法:Pass
语法:
Pass {[Name and Tasgs\] [RenderSetup\] [TextureSetup]}
基本通道命名包含一个可能的渲染设置命令。 以及接着一个可选的一组使用贴图
Name and Tags
一个通道可能定义它的名字 和 任意个数标签(key/value队,用于进行通道与引擎间交互)。
Rander Setup
通道设置多个图形硬件状态,如打开alpha混合, 使用雾。等等, 命令如下:
Material
Material { Material Block}
定义一个用在顶点光照管线的材质。 见【Material page】
Lighting
Lighting On | Off
打开|关闭顶点光照. 见【Material page】
Culling
Cull Back | Front | Off
设置多边形拣选模式.见【 Cull and Depth page 】
ZTest
ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
设置深度检测模式.见【 Cull and Depth page 】
ZWrite
ZWrite On | Off
设置深度写模式.见【 Cull and Depth page 】
Fog
Fog {Fog Block}
设置雾参数。见【Fog page 】
AlphaTest
AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)
打开Alpha测试。见【Alpha Testing page】
Blend
Blend SourceBlendmMode DestBlendMode
设置混合模式。见【 Blending page】
Color
Color Color-value
在顶点光照打开时,选用的顶点颜色.见【Material page】
ColorMask
ColorMask RGB | A | 0 | any combinaion of R,G,B,A
设置颜色写入mask, 0,表示关闭所有颜色通道写入.见【Material page】
Offset
Offset OffsetFacotr, OffsetUnits
设置Z深度缓冲偏移.见【 Cull and Depth page 】
SeperateSpecular
SeperateSpecular On | Off
打开|关闭顶点光照的分隔高光.见【Material page】
ColorMaterail
ColoerMaterial AmbientAndDiffuse | Emission
使用每一个顶点光,当在计算顶点光照时。见【Material page】
Texture Setup
在渲染状态设置后,你可能指定一定数量的贴图和它们的组合模式,通过SetTexture进行应用
ShaderLab 语法:Color,Material,Lighting
材质与光照参数用来控件内建顶点光照。顶点光照是标准的D3D/OPENGL光照模式,它为每个顶点逐一计算。Lighting On 打开顶点光照,光照受到Material block,ColorMaterail,SeperateSpecular命令影响。
像素光照通常用自定义vertex/fragment程序实例,而不是用顶点光照。 下诉命令在像素光照中无效。
Unity3d Shader的更多相关文章
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- Unity3D shader简介
Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 转 猫都能学会的Unity3D Shader入门指南(二)
猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...
- Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- 【淡墨Unity3D Shader计划】四 热带雨林的文章: 排除、深度测试、Alpha测试和基本雾编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云 ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- 猫都能学会的Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
随机推荐
- SQL Server数据库(SQL Sever语言 函数以及SQL编程)
1.数学函数:操作一个数据,返回一个结果 --去上限: ceiling ☆select ceiling(price) from car --去下限:floor ☆select floor(price) ...
- 137. Single Number II——问题是查找,本质是hash查找,只是记录的是32 bit中各个位出现次数而已
Given an array of integers, every element appears three times except for one. Find that single one. ...
- ZooKeeper(3.4.5) 使用Curator监听事件
转载:http://www.mamicode.com/info-detail-494364.html 标签: ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher ...
- async 和await
这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...
- php 5.5.1 编译安装过程
1.下载解压 wget http://au1.php.net/get/php-5.5.1.tar.gz/from/ch2.php.net/mirror tar zxvf php-5.5.1.tar.g ...
- 如何提取HTML代码中img的src地址?
答案:专门的代码 使用专门的正则表达式 /// <summary> /// 获得HTML中所有图片的src地址[比较稳定的一个版本] /// </summary> /// &l ...
- HDU 5773 The All-purpose Zero 求LIS
求最长上升子序列长度: 单纯的dp时间复杂度是O(n*n)的 dp[i] = max(dp[j]+1); (0=<j<=i-1 && a[i]>a[j]) 用二分可以 ...
- Visual Studio 2012中的为创建类时的添加注释模板
我们往往需要给类添加注释,我们可以把注释块复制出来,放到文件中,然后在需要的时候,复制.粘贴.这样的重复劳动增加了程序员的体力劳动,而VS中给我们提供了项模版,我们只需要在其中修改一点点模版就能达到这 ...
- 判断IE8
var browser=navigator.appName; var panduan_hide='style="display:none;"'; if(browser= ...
- 分批次从musql取数据,每次取1000条
$t = new Gettags(); $num=$t->sum_tag(); $num=$num/1000; $flag_num=ceil($num); $flag_array=array() ...