Shader编写指南(三十三):ShaderLab旧版方法:光照系统

注意
此页面介绍的 ShaderLab 功能已过时,仅为向后兼容而记录。如果着色器源文件包含 HLSL 代码,Unity 会完全忽略这些命令;若不包含 HLSL 代码,Unity 会在导入时将这些命令编译为常规着色器程序。

渲染管线兼容性

功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP
旧版光照系统✔️ 支持❌ 不支持❌ 不支持❌ 不支持

概述

材质和光照参数用于控制内置顶点光照。顶点光照是基于每个顶点计算的标准 Direct3D/OpenGL 光照模型。通过Lighting On启用光照,光照效果受Material块、ColorMaterialSeparateSpecular命令影响。

顶点着色与光照是所有渲染几何体的首个计算效果,它在顶点级别运算,计算纹理应用前的基础颜色。

语法说明

顶级命令用于控制是否使用固定函数光照及部分配置选项,核心设置包含在Material块中(详见下文)。

1. Color命令

hlsl

Color color  
  • 将对象设置为纯色。color可以是括号内的四个 RGBA 值,或方括号内的颜色属性名称。
2. Material

hlsl

Material {  
    // 材质属性配置  
}  

用于定义对象的材质属性,可省略部分属性(默认值为黑色,即无效果):

  • Diffuse:漫反射颜色,对象的基础颜色。
  • Ambient:环境光颜色,受 Lighting 窗口中环境光设置影响。
  • Specular:高光颜色,决定高光外观。
  • Shininess:光泽度(0-1),值越小高光越柔和,值越大高光越锐利。
  • Emission:自发光颜色,不受光照影响的颜色。
3. Lighting命令

hlsl

Lighting On | Off  

  • On:启用内置顶点光照,材质块属性生效。
  • Off:禁用光照,直接使用Color命令指定的颜色。
4. SeparateSpecular命令

hlsl

SeparateSpecular On | Off  

  • On:将高光光照独立计算并叠加到最终颜色,不受纹理影响(仅在Lighting On时有效)。
  • Off:高光与漫反射共同受纹理影响(默认行为)。
5. ColorMaterial命令

hlsl

ColorMaterial AmbientAndDiffuse | Emission  

  • AmbientAndDiffuse:使用顶点颜色覆盖材质的环境光和漫反射颜色。
  • Emission:使用顶点颜色覆盖材质的自发光颜色。

光照计算公式

对象最终颜色 =
环境光 × 项目环境光强度 +
Σ(灯光颜色 × 漫反射 + 灯光颜色 × 高光) +
自发光颜色
(括号内部分对每个影响对象的灯光重复计算)

最佳实践:通常保持漫反射(Diffuse)与环境光(Ambient)颜色一致(所有内置着色器均遵循此规则)。

示例代码

示例 1:纯红色对象(无光照)

hlsl

Shader "Solid Red" {  
    SubShader {  
        Pass { Color (1,0,0,0) } // RGBA纯红色(Alpha=0不影响,因无混合)  
    }  
}  
示例 2:白色顶点光照对象

hlsl

Shader "VertexLit White" {  
    SubShader {  
        Pass {  
            Material {  
                Diffuse (1,1,1,1)  // 漫反射白色  
                Ambient (1,1,1,1)  // 环境光白色(与漫反射一致)  
            }  
            Lighting On  // 启用光照  
        }  
    }  
}  
示例 3:带材质属性的顶点光照

hlsl

Shader "VertexLit Simple" {  
    Properties {  
        _Color ("Main Color", COLOR) = (1,1,1,1)  // 暴露颜色属性到材质面板  
    }  
    SubShader {  
        Pass {  
            Material {  
                Diffuse [_Color]  // 使用属性值作为漫反射  
                Ambient [_Color]  // 使用属性值作为环境光  
            }  
            Lighting On  
        }  
    }  
}  

示例 4:完整顶点光照着色器(含纹理)

hlsl

Shader "VertexLit" {  
    Properties {  
        _Color ("Main Color", Color) = (1,1,1,0)  
        _SpecColor ("Spec Color", Color) = (1,1,1,1)  // 高光颜色  
        _Emission ("Emmisive Color", Color) = (0,0,0,0)  // 自发光  
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7  // 光泽度  
        _MainTex ("Base (RGB)", 2D) = "white" {}  // 基础纹理  
    }  
    SubShader {  
        Pass {  
            Material {  
                Diffuse [_Color]  
                Ambient [_Color]  
                Shininess [_Shininess]  
                Specular [_SpecColor]  
                Emission [_Emission]  
            }  
            Lighting On  
            SeparateSpecular On  // 独立计算高光(不受纹理影响)  
            SetTexture [_MainTex] {  // 应用纹理(与光照结果混合)  
                Combine texture * primary DOUBLE, texture * primary  
            }  
        }  
    }  
}  

注意事项

  • 局限性:旧版光照仅支持顶点级光照计算,无法实现像素级光照(如 PBR 效果)。
  • 管线兼容性:URP/HDRP/SRP 均不支持此功能,建议迁移至可编程渲染管线(如使用 HLSL 编写光照逻辑)。
  • 性能影响:固定函数管线性能较低,现代项目应优先使用 ShaderLab 的可编程功能(如HLSLPROGRAM块)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李也疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值