Shader的笔记

Shader

1.Shader(着色器)

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

2渲染的流水线

Shader的笔记

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

3.GPU的流水线

Shader的笔记

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

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

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

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

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

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

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

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

Shader的笔记

4.屏幕坐标系

Shader的笔记

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在材质面板的位置为:Shader->Custom->MyShader

2.属性:属性将会出现在材质面板上

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

Properties{

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

}

Shader的笔记

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

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

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

定义:

SubShader{

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

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

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

Pass{

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

}

}

状态设置:

Shader的笔记

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

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

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

       Tags{“RenderType”=”Opaque”}

Shader的笔记

注:这些标签不能定义在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 结构体名称{

类型 变量名:语义;

类型 变量名:语义;

}

顶点着色器是逐顶点调用的,片元着色器是逐片元调用的。

10.属性的使用

Shader的笔记

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所用的材质面板

Shader的笔记

12.语义

Shader的笔记

Shader的笔记

Shader的笔记

13.光的渲染

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

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

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

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

BRDF光照模型:

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

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

漫反射:用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。

环境光:用于描述其他所有的间接光照。