1.shader理解是:
- GPU流水线上可高度编程的阶段;
- 有些特定类型的可编程着色器(如:顶点着色器、片元着色器);
- 依靠着色器我们控制流水线中的渲染细节。
2.出色的游戏画面需要:
包括shader在内的所有渲染流水线阶段的共同参与才可以完成。
- 设置适当的渲染状态
- 使用合适的混合函数
- 开启还是关闭深度测试/深度写入等。
3.如何充分利用unity shader为我们游戏添彩?
材质和unity shader:
一个单独的unity shader是无法发挥任何作用的,它必须和材质结合起来,才能发生神奇的化学反应。在unity中我们需要配合材质material和unityshader才能达到的效果。
- unity shader:定义了渲染所需的各种代码(如顶点着色器和片元着色器)、属性(如使用什么纹理)和指令(渲染和标签设置~)
- 材质:允许我们调节这些属性,并将其最终赋给相应的模型。
一个常见流程:
1.创建一个材质;
2.创建一个unity shader并把它付给上一步创建的材质
3.把材质赋给要渲染的对象
4.在材质面板中调整unity shader的属性,知道得到满意的效果。
unityshader
创建:
Assets --》create --》shader
- standard surface shader 会产生一个包含了标准光照模型(使用unity5中新添加基于物理的渲染方法);(为我们提供了典型的表面着色器的实现方式)
- unlit shader则会产生一个不包含光照(但包含雾效)的基本的顶点/片元着色器;(我们通常用unlit shader生成一个基本的顶点/片元着色器模板)
- image effect shader 则为我们实现各种屏幕后处理效果提供一个基本模板;
- Compute shader会产生一种特殊的shader文件,这类shader旨在利用GPU的并行性来进行一些与常规渲染流水先无关的计算。
相关信息:
- surface shader(它是否是一个表面着色器)
- fixed function shader(是否是一个固定函数着色器)
- conplied code该shader针对不同图像编程接口最终变异成的shader代码。
----《还有一些信息是我们再unityshader中的标签设置有关》----
- cast shadows 是否会投射阴影
- render queue 使用的渲染队列
- LOD LOD值
- ignore projector
- disable batching 是否关闭批处理
- properties 属性列表
为unity shader服务的语言 -- shaderLab:
- 所有的unity shader都是使用shaderlab来编写的。
- shaderLab是unity提供的编写unityshader的一种说明性语言。
- 一个unity shader的基本结构如下所示:
Shader "ShaderName"{
Properties{
//属性
}
SubShader{
//显卡A使用的子着色器
}
SubShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
-
unity在背后会根据使用的平台来把这些结构编译成真正的代码和shader文件,而开发者只需要和unity shader打交道即可。
Properties:材质和unity shader的桥梁
Properties语义中包含了一些列的属性(property),这些属性(property)将会出现在材质面板中
Properties{
Name("display name",PropertyType) = DefaultValue
Name("diaplay name",PropertyType) = DefaultValue
//更多属性
}
- 属性名字通常由一个下划线开始
- display name 显示的名称:出现在材质面板上的名字。
- PropertyType为每个属性指定他的类型(Int/Float/Range(min,max)/Color/Vector/2D/Cube/3D)
- 我们还需要为每个属性制定一个默认值。
展示所有属性类型:
Shader "Custom/ShaderLabProperties"{
Properties{
//Number and Sliders
_Int ("Int",Int)=2
_Float("Float",Float)=1.5
_Range("Range",Range(0.0,5.0))=3.0
_Color("Color",Color)=(1,1,1,1)
_Vector("Vector",Vector)=(2,3,6,1)
_2D("2D",2D)=""{}
_Cube("Cube",Cube)="white"{}
_3D("3D",3D)="black"{}
}
FallBack "Diffuse"
}
材质面板显示效果:
4.shader graph
创建用于Shader Graph
的新项目时,请确保选择正确的模板。
仅适用于相对较新的可脚本化渲染管线(Scriptable Render Pipeline)
,即“高清晰度”渲染管线(High-Definition Render Pipeline)
或“轻量级”渲染管线(Lightweight Render Pipeline)
。
配置为使用“轻量级渲染管道”(Lightweight Render Pipeline)
。 首先,在PackageManager
中,选择Window►PackageManager
,确认已安装Lightweight RP
和ShaderGraph.
在Graphics
选项卡中,Scriptable Render Pipeline Settings
应显示为LWRP-HighQuality
。 这会将您的项目设置为使用“轻量级渲染管道”的最高默认设置。
确认您正在使用脚本编写的渲染管道资源(Scriptable Render Pipeline )
之一后,关闭此窗口。
通过选择Create ► Shader ► PBR Graph
来创建PBR Graph
。 这是一个着色器图,支持基于物理的渲染或PBR
。
Unity强化篇(九) —— Shader Graph简介(一) - 简书
5.GPU了解
6.shader的三种变成语言
基于OpenGL 的OpenGL shading language ,简称GLSL
基于directX的high level shading language,简称HLSL
基于NVIDIA公司的C forgraphic,简称CG语言。
shader language,赋予程序员灵活而方便的编程方式,并尽可能的拿代码控制渲染过程(GPU编程),同时利用图形硬件的并行性,提高算法的效率。
CG程序是运行在OpenGL和directX标准定点和像素着色的基础上的,CG和HLSL的公司英伟达和微软相互协作在标准硬件光照语言的语法和语义上达成了一致开发,所以其实是同一种语言。
7.渲染流程了解
总结
命令缓冲区