【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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值