Hello ,I am Edwin
首先谢谢大家的支持,其次如果你碰到什么其他问题的话,欢迎来 我自己的一个 讨论群559666429
来,大家一起找答案,共同进步
Unity3D Shader<认识Shader类型>(一)
友情提示:在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这几篇文章《unity3d shaderlab在vs的高亮显示》使代码高亮显示,也可以下载shaderlabvs或NShader之类的插件使代码高亮显示。
OpenGL渲染管线:
如图所示,这是OpenGL的工作流程图。
关于图中的各个过程具体都在做些什么工作,可以看看这篇博客《OpenGL渲染管线》,讲得挺详细的,我就不赘述了。
上述的这些过程,初学者可以简单地记为四个部分
顶点变换 → 图元装配和光栅化 → 片元纹理映射和着色 → 写入帧缓存
可编程的部分就是顶点变换和片元着色啦。
渲染管线中 ——像素处理:
- 对每个像素区域进行着色
- 对像素贴上贴图
- 形成最终的画面
- 输入 : 像素的位置,深度,贴图坐标, 法线,切线,颜色等等
- 输出 :每个像素的颜色,透明度
流成:
其中 CPU 和 GPU 的 工作分别为 :
Shader的粗鲁理解:
Shader的意思就是着色器,也就是“给物体上色”,所以Shader的作用就是通过计算物体的像素,片段,顶点等等而最终决定物体显示的是什么,怎么显示。
GPU这个名词相信大家都不陌生。它是计算机处理图像的元件。GPU是Graphic Processing Unit(图形处理单元)的缩写。由于 GPU 具有高并行结构(highly parallel structure),所以 GPU 在处理图形数据和复杂算法方面拥有比 CPU 更高的效率。我们来看一下下面两段代码的对比,这两段代码都是提取 2D 图像上每个像素点的颜色值,第一段是在CPU上运算的C++代码,第二段是在GPU上运算的Cg代码:
img
CPU要用for循环语句遍历像素,而GPU只要一行代码就够了。GPU在图形处理方面很强大吧?
而Shader,就是GPU执行的一段针对3D对象进行操作的程序。
CPU要用for循环语句遍历像素,而GPU只要一行代码就够了。GPU在图形处理方面很强大吧?
而Shader,就是GPU执行的一段针对3D对象进行操作的程序。
Shader开发语言:
语言 | 介绍 |
---|---|
HLSL | 主要用于Direct3D。平台:windows。 |
GLSL | 主要用于OpenGL。 平台:移动平台(iOS,安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0) |
CG | 与DirectX 9.0以上以及OpenGL 完全兼容。运行时或事先编译成GPU汇编代码。 CG比HLSL、GLSL支持更多的平台,Unity Shader采用CG/HLSL作为开发语言。 |
Unity3D着色器,有四种不同的类型:
英文 | 中文 | 介绍 |
---|---|---|
surface shaders | 表面着色 | Unity3d推荐的Shader类型。它是一个代码生成器,帮我们将重复的代码省去了,使得编写Shader更为容易。使用的也是CG/HLSL语言。 |
vertex and fragment shaders | 顶点和片段着色器 | 最强大的Shader类型,属于可编程渲染管线。使用的是CG/HLSL语言。也就是我上面说过的两种。 |
fixed function shaders | 作为固定功能着色 | 属于固定渲染管线Shader, 基本用于高级Shader在老显卡无法显示时的备用Shader。 |
Compute Shader | Unity新增的一种Shader( 使用HLSL语言) | Compute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力,也就是我们说的GPGPU的概念和物理加速运算。 |
Unity Shader | 介绍 |
---|---|
Standard Surface Shader | 表面着色 |
Unlit Shader & ImageEffect Shader | 顶点和片段着色器 |
Compute Shader | Unity新增Shader |
无论您选择哪种类型,实际的shader代码总是会被裹在被称为ShaderLab的语言中,这是用来组织结构着色。它看起来像这样:
Shader "Unlit/ff"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
这个很重要的,官方的东西比你收到的任何博客资料都详细而且无误。只是是英语,得慢慢认真看。虽然我也还没有看。哈哈哈~~~
Unity3D官网教程梳理:
- ShaderLab syntax: Shader(ShaderLab的基本语法框架介绍)
- ShaderLab syntax: Properties(ShaderLab语法中 Properties(特性)的介绍)
- ShaderLab syntax: SubShader(ShaderLab 代码中SubShader块的语法内容介绍)
- ShaderLab syntax: Pass(Pass语块的介绍,通常里面是一些标签介绍)
- ShaderLab: Culling & Depth Testing(一些剔除和深度的标签)
- ShaderLab: Blending(混合的一些标签。可以控制物体的模糊和锐化程度)
- ShaderLab: Pass Tags(标签的定义介绍)
- ShaderLab: Stencil(一些模版的介绍,这个没有用过)
- ShaderLab: Name(名字的定义。定义之后,两个不同的Pass 之间就可以通过Name访问)
- ShaderLab: Legacy Lighting(传统灯光的一些定义。比如接收灯光)
- ShaderLab: Legacy Texture Combiners(传统纹理贴图合成的语法介绍。可以定义一些贴图的行为。比如贴图的“Multiply””Add”等效果)
- ShaderLab: Legacy Alpha Testing(传统透明通道语法。有种模糊边界的感觉)
- ShaderLab: Legacy Fog(雾的语法了。)
- ShaderLab: Legacy BindChannels(混合通道的语法。没用过。哈哈~~)
- ShaderLab: UsePass(另外一个Pass怎么去调用另一个Pass的语法)
- ShaderLab: GrabPass(获取另一个Pass的变量。比如获取贴图。写贴图定义的名字就OK)
- ShaderLab: SubShader Tags(Tage 的定义语法。比如tag 决定了这个是透明还是不同名物体)
- ShaderLab syntax: Pass(Pass语块的介绍,通常里面是一些标签介绍)
- ShaderLab: Fallback(回退的语法。当Pass里面的代码无法执行的时候执行这里的方法)
- ShaderLab: CustomEditor(自定义编辑器。写在properties and subshaders 语块之外。没用过)
- ShaderLab: other commands(另外一些命令。比如 Fog 雾 的接收和不接收)
- Writing Surface Shaders(表面着色器的一些介绍)
- Writing vertex and fragment shaders(顶点和片段着色器 的 介绍)
- Vertex and fragment shader examples(一些简单案例)
- Shader semantics(语法的一些介绍)
- Accessing shader properties in Cg/HLSL(CG/HLSL的一些属性)
- Providing vertex data to vertex programs(向顶点处理程序提供顶点数据的语法介绍。比如顶点的 位置,法向量,颜色,坐标,切线)
- Built-in shader include files(介绍一下内置 的 库。比如“UnityCG.cginc”)
- Predefined Shader preprocessor macros(介绍一些 着色器预处理器宏。比如平台硬件的判断)
- Built-in shader helper functions(内置的一些帮助函数,比如转化坐标,灯光方向,等等)
- Built-in shader variables(内置的一些 Shader 变量)
- Making multiple shader program variants(制作多个着色器程序变量。不懂)
- GLSL Shader programs(GLSL着色器程序,没用过)
- Shading Language used in Unity(在Unity 中 使用的 Shader 语言介绍。就是说,他支持 HLSL/CG 语言等等,吧啦吧啦的)
- Shader Compilation Target Levels(着色器编译目标级别)
- Shader data types and precision(着色器数据类型和精度。就是介绍如,float,half,fixed登类型)
- Using sampler states(具体介绍了一下 图片 sampler的一些功能、可以做马赛克哦)
- Shader assets(Unity 中 Shader 的创建以及“Inspector”面板的一些操作说明)
- Advanced ShaderLab topics(一些Shdaer 新功能的 话题)