Shader的笔记

Shader

1.Shader(着色器)

最终目的在于生成或者是渲染一张二维纹理。

2渲染的流水线

应用阶段:把数据加载到显存;设置渲染状态;调用Draw Call。

3.GPU的流水线

顶点着色器:完全可编程的,实现顶点的空间变换、顶点着色等功能。

曲面细分着色器:可选的,用于细分图元。

几何着色器:可选,用于执行逐图元的着色操作,或者产生更多的图元。

裁剪:可配置的,将不在摄像机视野内的顶点裁剪掉,剔除某些三角图元的面片。

屏幕映射:不可配置和编程的,把图元的坐标转换到屏幕坐标系中。

三角设置与三角遍历:固定函数。

片元着色器:完全可编程的,实现逐片元的着色操作。

逐片元操作:不可编程,具有很高的可配置性,可以实现如修改颜色、深度缓冲、进行混合。

4.屏幕坐标系

5.减少Draw Call的开销

避免使用大量很小的网格。不可避免时,尽量想办法合并。

避免使用过多的材质。尽量不同的网格使用同一个材质。

6.固定渲染管线(固定函数的流水线)

自身坐标->世界坐标->视图坐标->背面拣选->光照->裁剪->投影->视口变换->光栅化

7.Unity Shader模板

Standard Surface Shader:包含了标准光照模型的表面着色器模板。

Unlit Shader:产生一个不包含光照(包含雾效)的基本顶点/片元着色器

Image Effect Shader:实现各种屏幕的后处理效果

Compute Shader:产生一种特殊的Shader文件,利用GPU的并行来进行一些与常规渲染流水线无关的计算。

8.Shader的结构

1.Shader “Custom/MyShader”{   }

那么这个Unity Shader在材质面板的位置为:Custom->MyShader,路径或者shader的命名可以与文件的名字不同

2.属性:属性将会出现在材质面板上(相当于C#脚本中的公用变量)

定义:_属性名(“显示的名称”,类型)=默认值

Properties{

_Range(“Range”,Range(0.0,5.0))=3.0

}

3.SubShader(这种语义是因为不同的显卡具有不同的能力)

 文件中可以包含多个SubShader语义块,但最少要有一个

Unity加载Shader时会去扫描所有的SubShader语义块,根据电脑的配置选择第一个能执行的SubShader,都不支持,Unity就会使用Fallback语义指定的Unity Shader。

定义:

SubShader{

[Tags]           //标签(可选的)

[RenderSetup]            //状态(可选的)

//这样设置标签和状态将会使用到所有Pass中

Pass{

       //Pass的数目过多,会影响渲染的性能

}

}

状态设置:

注:如果不希望状态应用于所有的Pass中,可以将状态设置在单个的Pass中。

标签:键值对(都为字符串类型)

定义:Tags{“标签名1”=”值1” “标签名2”=”值2”}

       Tags{“RenderType”=”Opaque”}

注:这些标签不能定义在Pass中。

Pass语义块

Pass{

       [Name]

       [Tags]

       [RenderType]

       //其他代码

}

9.顶点/片元着色器

Shader “MyShader”{

SubShader{

        Pass{

               CGPROGRAM

               #pragma Vertex vert                           //定义的顶点函数

               #pragma fragment frag                      //定义的片元函数

                     float4 vert(float4 v:POSITION) :SV_POSITION{

                            return UnityObjectToClipPos(v);

                     }

                     fixed4 frag() : SV_Target{

                            return fixed4(1.0,1.0,1.0,1.0);

               }

               ENDCG

        }

}

}

编译指令表示:

#pragma vertex 函数名           //顶点着色器

#pragma fragment 函数名             //片元着色器

自定义结构体:

struct 结构体名称{

类型 变量名:语义;

类型 变量名:语义;

}

struct a2v{

    float4 position:POSITION;

    fixed4 color:COLOR0;

};

顶点着色器是逐顶点调用的,片元着色器是逐片元(像素)调用的,像素点中间过渡部分是根据插值计算出来的。

10.属性的使用

注:凡是可以用float的地方,都可以使用half、fixed代替

1.float是32位存储的

2.half是16位存储的,范围为-6万~+6万之间

3.fixed是12位存储的,范围为-2~+2,可以用来表示颜色

11.内置的包含文件(以.cginc结尾,使用时用#include指令将它包含进来)

在官方网站(http://unity3d.com/cn/get-unity/download/archive)上选择下载->内置着色器

Unity的应用程序中直接找CGIncludes,Unity的安装路径/Data/CGIncludes

CGIncludes:包含所有的内置包含文件

DefaultResources:包含了一些内置组件或功能所需的Unity Shader

DefaultResourcesExtra:包含了所有Unity中内置的Unity Shader

Editor:用于定义Unity引入的Standard所用的材质面板

12.语义

13.光的渲染

散射:只改变光线的方向,不改变光线的密度和颜色。

吸收:只改变光线的密度和颜色,不改变光线的方向。

高光反射部分:表示物体表面是如何反射光线的

漫反射部分:表示有多少光线会被折射、吸收和散射出表面。

BRDF光照模型:

自发光:用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。(注:当没有使用全局光照技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。)

高光反射:用于描述当光线从光源照射到模型表面是,该表面会在完全镜面反射方向散射多少辐射量。

漫反射:用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。环境光:用于描述其他所有的间接光照。

Unity Shader中使用矩阵的方法:

UNITY_MATRIX_MVP       把模型空间坐标转换为裁剪空间坐标

UNITY_MATRIX_MV       把模型空间坐标转换为观察空间坐标

UNITY_MATRIX_V       把世界空间坐标转换为观察空间坐标

UNITY_MATRIX_P       把观察空间坐标转换为裁剪空间坐标

UNITY_MATRIX_VP       把世界空间坐标转换为裁剪空间坐标

UNITY_MATRIX_T_MV       UNITY_MATRIX_MVP的转置矩阵

UNITY_MATRIX_IT_MV       把法线从模型空间坐标转换到观察空间坐标 UNITY_MATRIX_MVP的逆转置矩阵,逆矩阵

_Object2World       模型矩阵,把模型空间坐标转换到世界空间坐标

_World2Object       _Object2World的逆矩阵,把世界空间坐标转换到模型空间坐标

UnityCG.cginc中一些常用的函数
    
    //摄像机方向(视角方向)
    float3 WorldSpaceViewDir(float4 v)      根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
    float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标->世界空间从这个点到摄像机的观察方向
    float3 ObjSpaceViewDir(float4 v)         模型空间中的顶点坐标->模型空间从这个点到摄像机的观察方向
    //光源方向
    float3 WorldSpaceLightDir(float4 v)     模型空间中的顶点坐标->世界空间中从这个点到光源的方向
    float3 UnityWorldSpaceLightDir(float4 v)     世界空间中的顶点坐标->世界空间中从这个点到光源的方向
    float3 ObjSpaceLightDir(float4 v)     模型空间中的顶点坐标->模型空间中从这个点到光源的方向
    //方向转换
    float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间->世界空间
    float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间->世界空间
    float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间->模型空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值