Unity3D逐顶点光照与逐像素光照详解

前言

在Unity3D中,光照是渲染过程中至关重要的一环。逐顶点光照和逐像素光照是两种常见的光照计算方法,它们各有优缺点,适用于不同的场景和需求。本文将详细介绍这两种光照技术的原理和实现方式,并提供相应的代码示例。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

逐顶点光照(Per-Vertex Lighting)

逐顶点光照是一种基于顶点的光照计算方法。它在每个顶点处计算光照值,然后在片段着色器中对这些光照值进行插值,以生成最终像素的颜色。这种方法的主要优点是计算量较小,适用于资源有限的平台,如移动设备。然而,由于顶点数目通常远小于像素数目,逐顶点光照在细节丰富的场景中可能会出现光照不均匀的情况。

技术详解

  1. 顶点着色器:在顶点着色器中,计算每个顶点的光照值。这通常包括环境光、漫反射光等。
  2. 插值:在片段着色器中,使用顶点着色器计算的光照值进行插值,以生成每个像素的颜色。

代码实现

以下是一个简单的逐顶点光照的顶点着色器示例:

 
 
Shader "Custom/VertexLit"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
o.Normal = float3(0, 0, 1);
o.Emission = 1.0;
}
ENDCG
}
}

C#代码示例,用于将材质设置为逐顶点光照:

 
 
using UnityEngine;
public class VertexLitShader : MonoBehaviour
{
public Material material;
void Start()
{
material.shader = Shader.Find("Custom/VertexLit");
}
}
逐像素光照(Per-Pixel Lighting)

逐像素光照是一种基于像素的光照计算方法。它在每个像素处计算光照值,从而能够更准确地模拟光照效果。这种方法适用于需要高质量光照效果的场景,但计算量相对较大。

技术详解

  1. 片段着色器:在片段着色器中,计算每个像素的光照值,并将其与材质的颜色进行混合。
  2. 光照模型:逐像素光照通常使用更复杂的光照模型,如兰伯特光照模型(Lambertian Reflectance)或Phong光照模型,以更准确地模拟光照效果。

代码实现

以下是一个基于兰伯特光照模型的逐像素光照片段着色器示例:

Shader "Custom/PixelLit"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_LightColor ("Light Color", Color) = (1,1,1,1)
_LightDirection ("Light Direction", Vector) = (0,0,-1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float4 _Color;
float3 _LightColor;
float3 _LightDirection;
struct Input
{
float2 uv_MainTex;
float3 worldNormal;
};
void surf (Input IN, inout SurfaceOutput o)
{
float3 lightDir = normalize(_LightDirection);
float3 normal = normalize(IN.worldNormal);
float NdotL = max(0.0, dot(normal, lightDir));
float3 diffuse = _LightColor * _Color.rgb * NdotL;
o.Albedo = diffuse;
o.Emission = 0.0;
}
ENDCG
}
}

C#代码示例,用于将材质设置为逐像素光照:

using UnityEngine;
public class PixelLitShader : MonoBehaviour
{
public Material material;
void Start()
{
material.shader = Shader.Find("Custom/PixelLit");
}
}
总结

逐顶点光照和逐像素光照各有优缺点,适用于不同的场景和需求。逐顶点光照计算量小,适用于资源有限的平台,但在细节丰富的场景中可能会出现光照不均匀的情况。逐像素光照能够更准确地模拟光照效果,适用于需要高质量光照效果的场景,但计算量相对较大。在实际开发中,可以根据场景的要求选择适合的光照计算方法,以获得更好的光照效果和性能。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

猜你喜欢

转载自blog.csdn.net/Thomas_YXQ/article/details/143431176