Unity3d Shader篇(三)— 片元半兰伯特着色器解析

2024-02-06 06:36

本文主要是介绍Unity3d Shader篇(三)— 片元半兰伯特着色器解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、片元半兰伯特着色器是什么?
    • 1. 片元漫反射着色器的工作原理
    • 2. 片元半兰伯特着色器的优缺点
      • 优点:
      • 缺点:
    • 3. 公式
  • 二、使用步骤
    • 1. Shader 属性定义
    • 2. SubShader 设置
    • 3. 渲染 Pass
    • 4. 定义结构体和顶点着色器函数
    • 5. 片元着色器函数
  • 三、效果
  • 四、总结


前言

在 Unity 中,Shader 可以用来实现各种视觉效果。本教程将详细介绍如何编写一个基于片元半兰伯特着色器,使物体的颜色根据光照和法线方向的变化而变化。


一、片元半兰伯特着色器是什么?

1. 片元漫反射着色器的工作原理

片元半兰伯特着色器是一种用于在计算机图形学中模拟物体光照效果的着色器技术。它基于半兰伯特(Half Lambert)模型,用于计算物体在光照条件下的漫反射光照强度。与标准的兰伯特模型相比,片元半兰伯特着色器采用了一种简化的方法来计算漫反射光的强度,使得物体在光照变化时表现出更加柔和的过渡效果。

2. 片元半兰伯特着色器的优缺点

优点:

计算简单:片元半兰伯特着色器采用了简化的半兰伯特模型,计算相对较简单,不需要复杂的数学运算,因此性能开销较小。

柔和的光照过渡:由于采用了半兰伯特模型,产生的光照效果更加柔和,物体在光照变化时表现出更加自然的明暗过渡效果。

适用性广泛:片元半兰伯特着色器适用于对光照效果要求不是特别高的场景,能够在性能受限的情况下实现基本的光照效果。

性能开销较小:简化的计算模型使得片元半兰伯特着色器的性能开销相对较小,适用于需要在性能受限情况下实现光照效果的场景。

缺点:

缺乏真实感:片元半兰伯特着色器采用了简化的模型,可能无法准确地模拟真实世界中复杂的光照效果,导致生成的图像缺乏真实感。

不适用于高要求场景:由于是基于简化的模型,片元半兰伯特着色器在需要较高光照效果真实感的场景下可能表现不佳,无法满足高要求的视觉效果。

局限性:半兰伯特模型适用于特定类型的材质和光照条件,对于一些特殊情况可能无法准确表现,导致着色效果不理想。

有限的光照控制:片元半兰伯特着色器对于光照效果的控制有限,无法实现一些复杂的光照效果,如阴影和反射等。

3. 公式

在这里插入图片描述

二、使用步骤

1. Shader 属性定义

Properties
{_Diffuse("Diffuse", Color) = (1, 1, 1, 1) // 漫反射颜色属性,默认白色
}

这段代码定义了 Shader 的属性。在本例中,我们只有一个属性 _Diffuse,表示物体的基本颜色,使用 RGBA 形式表示。默认为白色。

2. SubShader 设置

SubShader
{Tags{"RenderType" = "Opaque" // 渲染类型为不透明}LOD 100 // 细节级别
}

SubShader 定义了一组渲染设置,包括标签和细节级别。在这里,我们将渲染类型标签设置为 “Opaque”,表示物体是不透明的。

3. 渲染 Pass

Pass
{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"
}

这里开始了渲染 Pass 部分。在这里,我们使用了 CGPROGRAM 指令来声明顶点着色器和片元着色器函数。#pragma vertex vert 和 #pragma fragment frag 分别指定了顶点着色器函数和片元着色器函数的名称。

然后,我们包含了 UnityCG.cginc 和 Lighting.cginc,它们提供了许多有用的函数和宏,用于简化编写 Shader。

4. 定义结构体和顶点着色器函数

struct v2f
{float4 vertex : SV_POSITION; // 顶点位置fixed3 worldNormal : TEXCOORD0; // 颜色
};v2f vert(appdata_base v)
{v2f o;o.vertex = UnityObjectToClipPos(v.vertex); // 顶点位置变换到裁剪空间fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); // 世界空间法线o.worldNormal = worldNormal;return o;
}

这里定义了结构体 v2f,用于从顶点着色器向片元着色器传递数据。在顶点着色器函数中,我们将顶点位置转换到裁剪空间,并计算世界空间的法线向量。

5. 片元着色器函数

fixed4 frag(v2f i) : SV_Target
{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取环境光fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); //获取光源位置//* 0.5 + 0.5半兰伯特模型fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (dot(worldLightDir, i.worldNormal) * 0.5 + 0.5);fixed3 color = diffuse + ambient; // 最终颜色return fixed4(color, 1); // 输出颜色
}

片元着色器函数计算最终的颜色。首先,我们获取环境光和光源位置。然后,计算漫反射光照,并将环境光和漫反射光照相加得到最终颜色。

三、效果

左:顶点漫反射 中:片元漫反射 右:片元半兰伯特
在这里插入图片描述
在这里插入图片描述

四、总结

片元漫反射、顶点漫反射和片元半兰伯特着色器是用于模拟物体在光照条件下的重要技术,它们各自有着不同的特点和适用场景。

片元漫反射:在每个像素上计算的漫反射光照效果。它提供了更精细的光照效果,因为考虑了每个像素的光照情况。适用于需要高度真实感和精细光照效果的场景,例如逼真的游戏场景、影视特效等。

顶点漫反射:在顶点级别计算的漫反射光照效果。计算量较小,适用于对性能要求较高或需要大量物体渲染的场景。可以在渲染管线的早期阶段就进行计算,节省计算资源。

片元半兰伯特着色器:常用于实现逼真的漫反射效果,考虑了光线入射角和表面法线之间的关系,符合半兰伯特定律。能够为渲染场景增加一定的真实感,特别是在模拟粗糙表面时效果较好。
然而,片元半兰伯特着色器也有局限性,它仅考虑了漫反射光照,未考虑其他光照效果,如镜面反射、环境光照等。在某些场景中,特别是需要更复杂光照效果以增强真实感时,仅使用片元半兰伯特着色器可能会导致渲染结果缺乏真实感。
因此,为了实现高度逼真的渲染效果,通常需要综合考虑多种光照技术,并根据场景需求选择和调整。片元半兰伯特着色器在模拟物体表面的漫反射方面表现良好,但在其他方面可能需要配合其他技术以获得更好效果。

这篇关于Unity3d Shader篇(三)— 片元半兰伯特着色器解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/683435

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷