游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   爱编程的菇凉

Shader学习笔记(1):Shader基础

个人分类: Unity Shader | 2018-10-13 15:09
标签:Unity Shader
最近想学Shader,找到一个大佬的博客,该笔记只是自己学习Shader的知识记录,其实跟博客的内容差不多,但是写一遍,自己对shader的基础更加清楚,这将是一个系列笔记,大佬博客的地址:

1.unity提供的5种Shader模板
(1)Standard Surface Shader
基于物理渲染(PBS)的包含标准光照模型的表面着色器模板,在5.x版本中,我们新建一个材质,会默认使用unity内置的Standard Surface Shader,是使用基于物理渲染的技术,区别于传统的光照Shader,对光照渲染有更大的支持,如果想达到强大的效果,出了主纹理和法线纹理,可能需要加入金属纹理,粗糙度纹理,遮挡纹理,细节纹理,并配置一堆属性加探针啥的
(2)Standard Surface Shader(Instanced)
5.4版本后加的,使用GPU Instancing技术,在使用相同材质和网格的情况下可以大幅度降低Draw Call,在生成阴影Pass中使用了该技术。
(3)Unlit Shader
不包含光照但包含雾效的顶点片元着色器。
(4)Image Effect Shader
简单的图片展示效果,为实现屏幕后处理效果提供了基本模板。
(5)Compute Shader
产生特殊的Shader文件,利用GPU的并行性来进行一些与渲染流水线无关的计算。
(1)(2)-----------表面着色器
(3)(4)-----------顶点片元着色器(要学的)
2.ShaderLab——unity Shader的语言
3.Unity Shader结构
(1)名字
每个shader第一行需要定义一个名字,格式如:Shader "Hidden/ImageShaderTest",对应的路径:Hidden->ImageShaderTest
(2)属性(properties)
Properties{
Name("display name",type)=value
Name("display name",type)=value
................
}
Name---属性名字,代码用的 display name---面板中显示的名字 type--属性类型 value:默认值
Properties包含了一系列属性,类似类中的public变量,属性类型如图:
代码如:
(3)SubShader
一个Shader文件可以包含多个SubShader,但至少要有一个。Unity加载Shader时,会扫描并选择一个能在目标平台运行的SubShader,如果都不支持,会用Fallback指定的Shader.
SubShader{
//可选(标签)
[Tags]
//可选(状态)
[RenderSetup]

Pass{}
//其他Pass
....................
}
A.Tags:标签,由一组键值对组成。键和值都是字符串,他们告诉Unity渲染引擎,希望怎样及何时渲染该SubShader,结构如下:
Tags{"TagsName1"="Value1" "TagsName2"="Value2"}
两个Tags之间不要加逗号或分号,只用空格分离
SubShader支持的标签类型如下:
B.RenderSetup:状态设置,
ShaderLab提供了一系列渲染状态的设置指令,可以在SubShader里,影响其下所有的Pass,也可以放在某个Pass下,只影响该Pass,常见指令如下:
C.Pass
SubShader中可以有很多Pass,每个Pass定义了一次完整的渲染流程,但pass过多会造成渲染性能下降,尽量使用最少数目的Pass。
Pass{
[Name]
[Tags]
[RenderSetup]
//代码
.........
}
Name-----pass名字 Name“MyPassName”,可以使用UsePass "MyShader/MYPASSNAME"在其他Shader中直接使用该pass。UsePass指令使用时pass名字必须使用大写形式的名字,因为unity内部会把所有的pass名称转换成大写字母。
RenderSetup使用方式同于SubShader中的
Tags在pass中的标签如下图:
一些特殊的Pass:
a.UsePass:可以用Pass的名字复用访问
b.GrabPass:该pass负责抓取屏幕并存到一张纹理中,后面的pass可以对该纹理继续处理
D.FallBack
放在最后,当所有的SubShader都不适合,就用FallBack提供的Shader。
FallBack"shaderName"或者 FallBack Off
FallBack的内置shader往往包含一个通用的阴影投射Pass,所以你不用自己实现。
SubShader例子:
4.Unity Shader种类
(1)表面着色器
Unity自己创造的一种着色器代码类型,少量的代码可以实现很大的功能,但其实它扩展开了就是顶点/片元着色器,只不过Unity替你封装好了很多代码,这样反而渲染代价比较大。
(2)Vertex/Fragment Shader(顶点/片元着色器)
我们主要学习的着色器,可以使用Cg/HLSL语言来编写,相对表面着色器复杂一些,但灵活性更高。
(3)Fixed Function Shader(固定函数着色器)
5.CG/HLSL, GLSL
HLSL-----------DirectX,High Level Shading Language
GLSL------------OpenGL,OpenGL Shading Language
CG-------------NVIDIA,C for Graphic
我们看到上面的Surface Shader和Vertex/Fragment Shader的代码示例,发现核心代码都放在CGPROGRAM和ENDCG之间,其实它们是在ShaderLab内部嵌套的CG/HLSL语言,因为CG和DX9风格的HLSL从写法上几乎是一样的,所以在Unity里CG和HLSL是等价的。我们也可以用GLSL来写,但发布平台会少一些,GLSL要嵌套在GLSLPROGRAM和ENDGLSL之间。
通常,Unity会自动把这些CG片段编译到所有相关平台上(D3D9,D3D11,OpenGL ES等),我们可以通过点击shader面板上的Compile and show code旁边的下拉按钮来看它当前编译的平台,你也可以更改要编译的平台。如下图:
但当发布游戏时,游戏数据文件中只包含目标平台需要的编译代码,其他平台的代码会被移除。
0 0

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号
关闭

站长推荐 上一条 /1 下一条

返回顶部