Unity3D Shader学习总结(一)

Hello ,I am Edwin


首先谢谢你们的支持,其次若是你碰到什么其余问题的话,欢迎来 我本身的一个 讨论群559666429来,你们一块儿找答案,共同进步

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


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


OpenGL渲染管线:

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

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

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


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

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

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

这里写图片描述

其中 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对象进行操做的程序。windows


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
        }
    }
}

这个很重要的,官方的东西比你收到的任何博客资料都详细并且无误。只是是英语,得慢慢认真看。虽然我也尚未看。哈哈哈~~~app

Unity3D官网教程梳理:

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