【Unity Shader】--入门知识点

着色器声明(“名字”)
Shader "ShaderDiffuseExample"
{
一、属性定义(作用:外部传入参数)
属性定义语法:PropName("DisplayName",PropType) = DefaultValue[{options}]
Properties
{
PropName:属性名,就是当前Shader的外部传入数据变量名。

DisplayName:Unity材质编辑器中显示的参数名,可作为脚本传参时的Key来给属性赋值。

PropType:属性的类型,UnityShader可用的类型有:
Color:颜色,有RGBA四个量来定义。
2D:一个二阶(2的n次幂像素)大小的贴图,这张纹理将在被采样后按照模型顶点UV进行颜色赋值。
Rect:一个非二阶贴图。
Cube:即为Cube map texture(立方体纹理);立方体纹理是有6张有关系的2D贴图的组合,
主要用做反射效果(比如天空盒和动态反射),也会被按照对应坐标采样。
Range(min,max):一个介于最小于最大值之间的浮点数
Float:任意一个浮点数
Vector:任意一个四维数

DefaultValue:属性默认初始值(当然这些值也是可以在后期用代码进行再赋值)
Color 格式为(1,1,1,1)
Rect 2D Cube可以用默认代表tini颜色的字符串 + {}:例如"white" "black" "gray" "bump"
Float Range 为浮点数值
Vector 格式为(x,y,z,w)

{options} :只针对于Rect 2D Cube会有的{},在他们初始值后面必须加上一个{},当我们有特点选项时就写在{}里面
选项有:ObjectLiner EyeLiner SphereMap CubeReflect CubeNormal(这些都是OpenGL中TexGen的模式)
}

二、子着色器(可以有多个子着色器)
(1)shader分为四种:
1、Fixed function shader 固定着色器
2、Vertex shader 和 Fragment shader 定点着色器和片段着色器
3、Surface shader 表面着色器
4、Compute shader 这是Unity3D新增的一种。看下度娘百科对它的介绍
(2)前三种shader不同点:
1、Vertex shader、Fragment shader、Surface shader可以实现Fixed function shader实现不了的高级功能
2、Vertex shader、Fragment shader、Fixed function shader 的shader主体中有pass{};但是Serface shader
已经把相关内容打包在了光照模型里了,不能有pass{}。
3、Fixed function shader每句代码后面不需要加";" 另外2种shader必须要加";"
4、它们的核心结构不同:
Fixed function shader核心结构是 Material{} 以及 SetTexture[_MainTex]{}
Surface shader 核心结构是
①使用Unity自带光照模型LightModel(如Lambert),也不顶点处理,只需要一个函数surf处理即可。
CGPROGRAM
#pragma surface surf Lambert
ENDCG
②使用自己写的光照模型LightModel,并且使用顶点处理函数vert
CGPRORAM
// surface 表面处理函数 光照模型 顶点处理:函数
#pragma surface surf lightModel vertex : vert
//执行顺序:顶点处理函数->表面处理函数->光照模型函数->颜色值
ENDCG
Vertex shader 和 Fragment shader 核心结构是
CGPROGRAM
#pragma vertex vert
#prgrma fragment frag
#include "Unity.cginc"
ENDCG

SubShader
{
1、Tags修饰:硬件将通过判断定义的这些标签来决定什么时候调用该着色器。Tags其实暗示了Shader的输出
"RenderType" = "opaque" :在渲染非透明物体时调用
"RenderType" = "opaque" :在渲染透明物体时调用
"IgnorProjector" = "True" : 不被Projector影响
"ForceNoShadowCasting" = "True" : 从不产生阴影
"Queue" = "xxx" : 指定渲染队列(渲染优先级),预定义的Queue有:
Backgroud = 1000最早被调用的渲染(用于天空盒或者背景)
Geometry = 2000 默认值,用来渲染非透明物体(场景中大部分都是用这个)
AlphaTest = 2450 用来渲染经过AlphaTest的像素(单独为AlphaTest设定一个Queue是出去效率的考虑)
Transparent = 3000 以从后往前的顺序渲染透明物体
Overlay = 4000 用来渲染叠加效果,是渲染的最后阶段(例如渲染镜头光晕特效)
附:除了用以上预定义的值,还可以自己定义Queue值(如 "Queue" = Transparent + 100,表示在Transparen之后100的Queue上调用)

例子:Tags{"RenderType" = "opaque"}

2、LOD值:它是Level of Detail的缩写,其实Unity的内建Diffuse着色器的设定值就是200。
这个数值决定了我们能用什么样的Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,
当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。

Unity内建Shader定义了一组LOD的数值,我们在实现自己的Shader的时候可以将其作为参考来设定自己的LOD数值,
这样在之后调整根据设备图形性能来调整画质时可以进行比较精确的控制。
VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600

例子:LOD 200

3、CG程序的主体(必须被包含在CGPROGRAM ... ENDCG之间)

(1)表面着色器:#pragma surface surfaceFuction lightModel[optionalparams]
声明要写一个表面着色器,表面着色器函数名称及指定的光照模型[可附带参数]
#pragma 声明着色器关键字
surface 声明着色器类型为表面着色器
surfaceFuction 表面着色器函数名称
lightModel 使用的光照模型
#pragma target 3.0 表示编译UnityShaderModel版本

CGPROGRAM
#pragma surface surf Lambert
#pragma vertex vert
#pragma fragment frag
ENDCG

}

三、回滚(在以上所有子着色器都没能执行时执行回滚)

例子: FallBack "Diffuse"
}

时间: 2024-10-13 02:45:33

【Unity Shader】--入门知识点的相关文章

Unity Shader入门精要读书笔记(一)序章

本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数学基础. 第五章:利用简单的顶点/片元着色器来实现辅助技巧. 第六章:基本光照模型. 第七章:法线纹理.遮罩纹理等基础纹理. 第八章:透明度测试和透明度混合. 第九章:复杂光照实现. 第十章:高级纹理(立方体纹理等). 第十一章:纹理动画.顶点动画. 第十二章:屏幕特效. 第十三章:深度纹理. 第十四章:非真

Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐标系下进行的. 一个二维的笛卡尔坐标系包含了两个部分的信息: 一个特殊的位置,即原点,它是整个坐标系的中心. 两条过原点的互相垂直的矢量,即X轴和Y轴.这些坐标轴也被称为是该坐标的矢量. OpenGL 和 DirectX 使用了不同的二维笛卡尔坐标系.如下图所示: 2)三维笛卡尔坐标系 在三维笛卡尔坐标系中,

Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交:一些光线被物体吸收了,而另一些光线被散射到其他方向. 最后,摄像机吸收了一些光,产生了一张图像. 在光学中,我们使用辐照度来量化光.对于平行光来说,它的辐照度可通过计算在垂直于l的单位面积上单位时间内穿过的能量来得到.在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面往往是和l不垂直的,我们可以

Unity Shader入门教程(一)

参考文献:http://www.360doc.com/content/13/0923/15/12282510_316492286.shtml Unity Shader是着色器,将纹理.网格信息输入,得到材质的一段程序,具体是个什么东西,还需要亲自实践才知道.一个Unity大神推荐我:如果要学计算机图形编程(游戏编程的基础),可以先学习UnityShader,往后再学习OpenGL和DX.不说废话,依我的风格,都是直接看实例,笔者的教程偏向于傻瓜式的,应该适合入门. 前提:安装了Unity和VS,

Unity Shader入门

这篇文章是我在学习蛮牛的一套关于Shader教程(http://www.unitytrain.cn/course/96)后的简单总结,个人感觉这套教程并不是以高级Shader编程为目的的,更像是授人以渔的宗旨.下面我会分为三个部分:Shader简述.图形学基础,Cg简介为大家介绍Shader的相关内容,也算是做一个总结. 一:Shader简述     a.先说一下GPU与CPU的区别,简单说:GPU主要负责跟显示相关的数据处理,而CPU主要负责操作系统和应用程序.为什么不把显示相关的数据直接交给

Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础

来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 概述 总体来说,在Unity中我们需要配合使用材质和Unity Shader才能达到需要的效果.一个最常见的流程是. 1)创建一个材质 2)创建一个Unity Shader,并把它赋给上一步创建的材质 3)把材质赋给要渲染的对象 4)在材质面板中调整Unity Shader的属性,以得到满意的效果 下图显示了Unity Shader和材质是如何一起工作来控制物体的渲染的. Uni

Unity Shader入门总结(一)

最近断断续续学习了一些Unity Shader的内容,总结一下,主要学习资料是siki学院的课程. Unity Shader基本结构 Shader "Unlit/002" //Shader路径 { Properties //Shader属性 可在面板修改 { _Int("Int",Int) = 2 _Float("Float",float) = 1.5 _Range("Range",range(0.0,2.0))= 1.0 _

Unity Shader入门教程(二)最基本的Diffuse和Normal样例

本教程参考了<猫都能学会的Unity3dShaderLab教程.CHM>, 1.请上网搜索并下载此文件. 2.随后再下载里面提到的素材: http://vdisk.weibo.com/s/y-NNpUsxhYhZI 第一组实验(复习课,实现最简单的漫反射 [该组实验参考了官网示例中的Normal-Diffuse.shader例子]): 第1.1步:创建一个名为"NormalDiffuse"的shader 第1.2步:看到其中有一些已有的内容,不妨全部删掉(除了第一行),这样

Unity Shader入门教程(四)反射光斑的实现

本节内容介绍PhongModel(也就是上文说的反射光的计算模型),采用的计算方法是BlinPhong(也即是用视线方向V+光源方向L的和,与N做点积,随后幂化得到高光反射系数)下图采用了csdn博文http://blog.csdn.net/u010133610/article/details/52206654中的一张插图. 第1.1步:新建shader和material,正如我前面的教程所说的那样. 第1.2步:代码如下: ▼代码开始 Shader "Custom/Learn2" {

Unity Shader 入门

To be more specific, a Shader defines: The method to render an object. This includes using different methods depending on the graphics card of the end user. Any vertex and fragment programs used to render. Some texture properties that are assignable