【Unity】入门学习笔记180716——Unity Shader入门(2-1)——开始Unity Shader

1、

最简单的顶点/片元着色器,组成结构

Unity内置的Unity Shader文件,提供的文件、内置变量和函数等

Unity Shader中使用的Cg语义

如何对Unity Shader进行调试

平台差异对Unity Shader的影响

编写Unity Shader的优化技巧

2、一个最简单的顶点/片元着色器

shader "name"{

    Properties{

        //属性

    }

    SubShader{

        //针对显卡A的SubShader

        Pass{

            //设置渲染状态和标签

            //    开始Cg代码片段

            CGPROGRAM

            //该代码片段的编译指令,例如:

            #pragma    vertex    vert

            #pragma    fragment    frag

            //Cg代码写在这里

            ENDCG

            //其他设置

        }

        //其他需要的Pass

    }

    SubShader{

        //针对显卡B的SubShader

    }

    //上述SubShader都失败后用于回调的Unity Shader

    Fallback "VertexLit"

}

最重要的部分是Pass语义,大部分代码写在这个语句块里面

3、Unity提供的内置文件和变量

    顶点/片元着色器的复杂之处在于,很多事情都需要我i们亲力亲为,例如我们需要自己转换发现方向,自己处理光照、阴影等。

为了方便开发者的编码过程,Unity提供了很多内置文件,这些文件包含了很多提前定义的函数、变量和宏等。

    包含文件,后缀为.cginc,在编写Shader时,可以用#include指令把这些文件包含进来,这样我们可以就可以使用Unity为我们提供的一些非常有用的变量和帮助函数。

    下载的内置着色器文件夹中的文件:

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

    DefaultResources:包含了一些内置组件或功能所需要的Unity Shader,例如GUI元素使用的Shader

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

    Editor:目前只包含了一些脚本文件,用于定义Unity5引入的Standard Shader所用的材质面板

    CGIncludes中主要的包含文件以及它们的主要用处:

文件名 描述
UnityCG.cginc 包含了最常使用的帮助函数、宏和结构体等
UnityShaderVariables.cginc 在编译Unity Shader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP等
Lighting.cginc 包含了各种内置的光照模型,如果编写的是Surface Shader的话,会自动包含进来
HLSLSupport.cginc 在编译Unity Shader时,会被自动包含进来。声明了很多用于跨平台编译的宏和定义

UnityCG.cginc是我们最常接触的一个包含文件,我们将使用很多该文件提供的结构体和函数

UnityCG.cginc中一些常用的结构体:

名称 描述 包含的变量
appdata_base 可用于顶点着色器的输入 顶点位置、顶点法线、第一组纹理坐标
appdata_tan 可用于顶点着色器的输入 顶点位置、顶点切线、顶点法线、第一组纹理坐标
appdata_full 可用于顶点着色器的输入 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标
appdata_img 可用于顶点着色器的输入 顶点位置、第一组纹理坐标
v2f_img 可用于顶点着色器的输出 裁剪空间中的位置、纹理坐标

UnityCG.cginc中一些常用的帮助函数:

函数名 描述
float3 WorldSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
float3 WorldSpaceLightDir(float4 v) 仅可用于向前渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化
float3 ObjSpaceLightDir(float4 v) 仅可用于向前渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向从模型空间转换到世界空间中
float3 UnityObjectToWorldDir(float3 dir) 把方向矢量从模型空间变换到世界空间中
float3 UnityWorldToObjectDir(float3 dir) 把方向矢量从世界空间变换到模型空间中

4、Unity提供的Cg/HLSL语义

从应用阶段传递模型数据给顶点着色器时Unityzhi'支持的常用语义

语义 描述
POSITION 模型空间中的顶点位置,通常时float4类型
NORMAL 顶点法线,通常是float3类型
TANGENT 顶点法线,通常是float4类型
TEXCOORDn,如TEXCOORD0、TEXCOORD1 该顶点的纹理坐标,通常是float2或float4类型
COLOR 顶点颜色,通常是fixed4或float4类型

从顶点着色器传递数据给pian片元着色器时Unity使用的常用语义

语义 描述
SV_POSITION 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量
COLOR0 通常用于输出第一组顶点颜色,但不是必需的
COLOP1 通常用于输出第二组顶点颜色,但不是必需的
TEXCOORD0~TEXCOORD7 通常用于输出纹理坐标,但不是必需的

片元着色器shu'输出时Unity支持的常用语义

语义 描述
SV_Target 输出值将会存储到渲染目标中

5、调试方法

      ①使用假彩色图像

      ②使用Visual Studio——Graphics Debugger

      ③帧调试器:Window——Frame Debugger

猜你喜欢

转载自blog.csdn.net/Dylan_Day/article/details/81064120
今日推荐