Unity3D Shader学习总结(一)

Hello ,I am Edwin


首先谢谢大家的支持,其次如果你碰到什么其他问题的话,欢迎来 我自己的一个 讨论群559666429来,大家一起找答案,共同进步

Unity3D Shader<认识Shader类型>(一)


友情提示:在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这几篇文章《unity3d shaderlab在vs的高亮显示》使代码高亮显示,也可以下载shaderlabvs或NShader之类的插件使代码高亮显示。


OpenGL渲染管线:

这里写图片描述
这里写图片描述
如图所示,这是OpenGL的工作流程图。
关于图中的各个过程具体都在做些什么工作,可以看看这篇博客《OpenGL渲染管线》,讲得挺详细的,我就不赘述了。
上述的这些过程,初学者可以简单地记为四个部分

顶点变换 → 图元装配和光栅化 → 片元纹理映射和着色 → 写入帧缓存

可编程的部分就是顶点变换和片元着色啦。


渲染管线中 ——像素处理:

  • 对每个像素区域进行着色
  • 对像素贴上贴图
  • 形成最终的画面

  • 输入 : 像素的位置,深度,贴图坐标, 法线,切线,颜色等等
  • 输出 :每个像素的颜色,透明度
流成:

Unity3D Shader学习总结(一)_第1张图片

其中 CPU 和 GPU 的 工作分别为 :

Unity3D Shader学习总结(一)_第2张图片


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: Fallback(回退的语法。当Pass里面的代码无法执行的时候执行这里的方法)
    • ShaderLab: CustomEditor(自定义编辑器。写在properties and subshaders 语块之外。没用过)
    • ShaderLab: other commands(另外一些命令。比如 Fog 雾 的接收和不接收)
  • Writing Surface Shaders(表面着色器的一些介绍)
    • Surface Shader examples(表面着色器的一些案例。可以跟着做一做)
    • Custom lighting models in Surface Shaders(自己如果不满足与Shader 自己的 光照模型。可以看这个,自己去自定义一个光照模型)
    • Custom lighting models in Surface Shaders(讲解一Unity 中的一些光照模型。)
    • Surface Shaders with DX11 / OpenGL Core Tessellation(一个强大的功能。曲面细分。听说很厉害,GPU不会过度消耗,又能细化模型细节。用的不多)
  • 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 新功能的 话题)

下一篇:Unity3D Shader创建一个双层的透明Shader(一)

你可能感兴趣的:(shader)