Unity3D Shader学习总结(一)

Hello ,I am Edwin


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

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


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


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 ShaderUnity新增的一种Shader( 使用HLSL语言)Compute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力,也就是我们说的GPGPU的概念和物理加速运算。

这里写图片描述

Unity Shader介绍
Standard Surface Shader表面着色
Unlit Shader & ImageEffect Shader顶点和片段着色器
Compute ShaderUnity新增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官网教程梳理:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值