首页 > 其他分享 >Unity3D 逐顶点光照与逐像素光照详解

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

时间:2024-02-28 09:44:24浏览次数:30  
标签:Unity3D 片段 MainTex 像素 顶点 着色器 光照

Unity3D提供了丰富的功能和工具,其中包括逐顶点光照和逐像素光照。本文将详细解释这两种光照技术的原理和实现方式,并提供代码示例。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

一、逐顶点光照

逐顶点光照是一种基于顶点的光照计算方法,即在每个顶点处计算光照值,然后在片段着色器中对光照进行插值。这种方法的优点是计算量小,适用于移动设备等资源有限的平台。

逐顶点光照的实现步骤如下:

  1. 创建一个材质,并将其渲染模式设置为"VertexLit"。
  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
    }
    
    FallBack "Diffuse"
}

在这个顶点着色器中,我们计算了顶点的光照值并将其传递给片段着色器。在片段着色器中,我们可以使用插值的光照值计算最终的颜色。

逐顶点光照虽然计算量小,但在细节丰富的场景中可能会出现光照不均匀的情况。因此,对于需要更高质量光照效果的场景,可以考虑使用逐像素光照。

二、逐像素光照

逐像素光照是一种基于像素的光照计算方法,即在每个像素处计算光照值。这种方法的优点是可以更准确地模拟光照效果,适用于需要高质量光照效果的场景。

逐像素光照的实现步骤如下:

  1. 创建一个材质,并将其渲染模式设置为"PixelLit"。
  2. 在片段着色器中计算像素的光照值,并将其与材质的颜色进行混合。

以下是一个简单的逐像素光照的片段着色器示例:

Shader "Custom/PixelLit"
{
    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
    }
    
    FallBack "Diffuse"
}

在这个片段着色器中,我们计算了像素的光照值并将其与材质的颜色进行混合。这样可以在每个像素处获得更准确的光照效果。

逐像素光照的计算量较大,适用于需要更高质量光照效果的场景。在实际开发中,可以根据场景的要求选择逐顶点光照或逐像素光照。

三、代码实现

下面是一个简单的逐顶点光照和逐像素光照的实现示例:

逐顶点光照:

using UnityEngine;

public class VertexLitShader : MonoBehaviour
{
    public Material material;

    void Start()
    {
        material.shader = Shader.Find("Custom/VertexLit");
    }
}

逐像素光照:

using UnityEngine;

public class PixelLitShader : MonoBehaviour
{
    public Material material;

    void Start()
    {
        material.shader = Shader.Find("Custom/PixelLit");
    }
}

以上是关于Unity3D逐顶点光照和逐像素光照的详细解释和代码实现。通过选择适合场景需求的光照计算方法,可以获得更好的光照效果和性能。希望本文对您有所帮助。

标签:Unity3D,片段,MainTex,像素,顶点,着色器,光照
From: https://www.cnblogs.com/bycw/p/18039035

相关文章

  • FSCapture如何将照片改为固定的尺寸和像素大小
    制作要求:原始照片像素为2134*3048;比如要求尺寸2.5*3.5cm(295*413像素),格式仅限JPG、png和JPEG,大小300KB以内(不包含)。FSCapture操作过程:(1)修正比例。打开FSCapture后,将照片拖入该软件内,计算高宽比为3.5/2.5=1.4(不要循环小数,目的是比例应一致),像素数必须是整数,基于这个原则,2134相......
  • Unity3D 帧同步的原理与常用的处理方式详解
    Unity3D是一款广泛应用于游戏开发的跨平台游戏引擎,其帧同步技术是实现多人游戏联机的关键之一。本文将详细介绍Unity3D帧同步的原理以及常用的处理方式,并给出相关的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏......
  • Python计算两图相似性-像素匹配(pixelmatch)
    1、简介GitHub:https://github.com/whtsky/pixelmatch-py 2、代码fromPILimportImagefrompixelmatch.contrib.PILimportpixelmatchimg_a=Image.open("WD1.png").resize((1920,1080))img_b=Image.open("WD2.png").resize((1920,1080))img......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    前言Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......
  • 【iOS ARKit】光照估计
    光照估计    AR与VR在光照上最大的不同在于VR世界是纯数字世界,有一套完整的数学模型,而AR则是将计算机生成的虚拟物体或关于真实物体的非几何信息叠加到真实世界的场景之上实现对真实世界的增强,融合了真实世界与数字世界。就光照而言,VR中的光照完全由开发人员决定,光照效......
  • iOS ARKit 光照效果之光源
    光照   在现实世界中,光扮演了极其重要的角色,没有光万物将失去色彩,没有光世界将一片漆黑。在3D数字世界中亦是如此,3D数字世界本质上是一个使用数学精确描述的真实世界复本,光照计算是影响这个数字世界可信度的极其重要的因素。光源   顾名思义,光源即是光的来源,常见......
  • 标准光照Shader
    思路《Shader入门精要》看到第九章,试着结合前面的知识实现一个标准光照模型,采用Blin-Phong模型,分为三大部分环境光,漫反射,高光反射。实现过程中加入凹凸效果,阴影效果。注释部分是透明效果,采用透明度测试的方法实现。具体细节见代码代码//UpgradeNOTE:replaced'mul(UNITY_MAT......
  • Unity3D 游戏中的自动寻路有怎样的算法详解
    前言Unity3D是一款非常流行的游戏引擎,它的自动寻路功能可以使游戏角色在场景中自动找到最短路径并前往目标位置。本文将详细介绍Unity3D中自动寻路的算法原理以及代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀在游戏开发中,自动寻路是......
  • Unity3D Rts游戏里的群体移动算法是如何实现的详解
    实时战略(RTS)游戏是一种以管理和控制虚拟军队为主题的游戏类型。在这类游戏中,玩家需要控制大量的单位进行战斗、资源采集和建设等操作。其中,群体移动算法是实现这些操作的关键之一。本文将详细介绍Unity3DRTS游戏中群体移动算法的实现原理和代码实现。对啦!这里有个游戏开发交流小......