深入学习Unity Shader的表面着色器

一、什么是表面着色器?

        表面着色器(Surface Shader)是 Unity 提供的一种特殊类型的着色器。它是对传统的顶点/片元着色器的封装,提供了更简化的语法和更高的抽象层级。表面着色器允许开发者专注于物体的表面特性,如光照和颜色,而不必深入处理底层的顶点和片元操作。

        结构学习

        对顶点着色器和片元着色器的进一层封装。主要部分为两个结构体(Input、SurfaceOutput)和编译指令(#pragma surface)。

        编译指令

   #pragma surface 是 Unity 表面着色器中最重要的编译指令,用于告诉 Unity 如何编译和处理表面着色器代码。下面详细解释其参数含义和用法:

        

#pragma surface surfaceFunction lightModel [optionalparams]

        参数详解

        1. surfaceFuntion(必需)

        含义:指定表面着色器函数的名称,该函数定义表面属性(如颜色、法线、金属度等)。

        要求:函数名称由用户的自定义(如surf);必须接受Input结构体作为输入,并输出surfaceOutput或其变体(如SurfaceOutputStandard)。

        示例:

        

void surf (Input IN, inout SurfaceOutputStandard o) {
    // 表面属性计算
}

        2. lightModel (必需)

        含义:指定使用的光照模型,决定如何计算光照效果。

        内置光照模型:

                        Lambert        简单漫反射光照

                        BlinnPhong    包含高光的Phong光照

                        Standard        基于物理的标准光照模型(金属 / 粗糙度工作流)

                        StandardSpecular  基于物理的标准光照模型(高光 / 光泽度工作流)

        物理的光照模型 Standard和StandardSpecular (在UnityPBSLighting.cginc中定义)

        非物理光照模型 Lambert和BlinnPhong (在Lighting.cginc中定义)

        自定义光照模型:

                        可指定自定义光照函数名称(如LightingCustom)

        示例:

#pragma surface surf Standard // 使用标准PBR光照模型

        3. [optionalparams](可选参数)

        这些参数提供了对表面着色器的行为精细控制,常用的选项有:

        光照相关的:

        fullforwardshadows:在 Forward 渲染路径中支持所有阴影类型(点光源、聚光灯等)

#pragma surface surf Standard fullforwardshadows

        addshadow: 自定义阴影投射通道。

#pragma surface surf Lambert addshadow

        渲染相关的:

        alpha: 开启透明度混合

#pragma surface surf Standard alpha

        vertex:vertexFunction: 指定自定义顶点处理函数

#pragma surface surf Standard verte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值