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); // 输出颜色
}

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

三、效果

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

四、总结

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT设置qss

Qt设置qss文件(设置在qrc中) 1、右击项目选择添加新文件 2、在弹出的对话框中选择Qt -> Qt Resource File 3、随便起一个名称 4、在代码路径下新建一个stylesheet.qss文件,随便写入一些样式 5、右击resources.qrc,选择添加…

地理格网地址赋码过程

1.地址地名赋码流程 1.由镇街收集数据并且统一入库到地址数据库中; 2.进行地址字段的详细校验; 3.对进行校验通过的数据按照西湖区统一地址规则进行赋码 4.对进行校验失败的数据反馈成 execl 给镇街进行数据的核对校对 2地址校验规则 # 必填字段规范 省(字段名 - provinc…

如何利用软件资产管理提高企业的效率和安全性

软件资产管理(Software Asset Management,简称SAM)是指对企业拥有或使用的所有软件资产进行规划,采购,部署,维护,优化和处置的过程和活动。软件资产管理的目的是确保企业的软件资产能够符合企业…

进阶C语言-通讯录的实现

通讯录 🎈1.设计要求🎈2.程序实现🔭2.1打印菜单及初始化通讯录🔭2.2显示所有联系人🔭2.3查找指定的联系人🔭2.4删除指定的联系人🔭2.5查找指定的联系人🔭2.6修改指定联系人🔭2.7按照年龄排序(以此为例)🎈3.全部源码以及实现🎈1.设计要求 🌞通过前面…

SpringSecurity(17)——OAuth2令牌管理策略

刷新令牌策略 注意&#xff1a;刷新令牌只有在授权码模式和密码模式中才有&#xff0c;对应的指定这两种模式时&#xff0c;在类型上加上refresh_token <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-se…

【Flink入门修炼】1-1 为什么要学习 Flink?

流处理和批处理是什么&#xff1f; 什么是 Flink&#xff1f; 为什么要学习 Flink&#xff1f; Flink 有什么特点&#xff0c;能做什么&#xff1f; 本文将为你解答以上问题。 一、批处理和流处理 早些年&#xff0c;大数据处理还主要为批处理&#xff0c;一般按天或小时定时处…

如何在docker中访问电脑上的GPU?如何在docker中使用GPU进行模型训练或者加载调用?

如何在docker中访问电脑上的GPU&#xff1f;如何在docker中使用GPU进行模型训练或者加载调用&#xff1f; 其实使用非常简单&#xff0c;只是一行命令的事&#xff0c;最主要的事配置好驱动和权限。 docker run -it --rm --gpus all ycj520/centos:1.0.0 nvidia-smi先看看 st…

Kafka 使用手册

kafka3.0 文章目录 kafka3.01. 什么是kafka&#xff1f;2. kafka基础架构3. kafka集群搭建4. kafka命令行操作主题命令行【topic】生产者命令行【producer】消费者命令行【consumer】 5. kafka生产者生产者消息发送流程Producer 发送原理普通的异步发送带回调函数的异步发送同步…

golang压缩与解压缩文件

全代码实现&#xff0c;如有帮助&#xff0c;欢迎留下足迹。 目录 压缩 核心处理 解压缩 压缩 入口压缩函数 useBasePathInZip参数&#xff1a; 为 false 相当于全文件视图&#xff0c;zip中没有目录 为 true表示保留源文件的路径&#xff08;srcPaths如果是相对路径&#…

【量子通信】量子通信技术:前景与挑战

量子通信技术&#xff1a;前景与挑战 一、技术背景二、技术原理量子叠加性&#xff1a;量子纠缠性&#xff1a;量子测量&#xff1a;量子不可克隆定理&#xff1a; 三、技术优缺点优点&#xff1a;安全性高&#xff1a;传输速度快&#xff1a;抗干扰性强&#xff1a;传输能力强…

CentOS 中文乱码

CentOS 中文乱码 1、 查看自己系统有没有安装中文语言包&#xff0c;可使用 locale -a 命令列出所有可用的语言环境 如果有中文&#xff0c;则不用安装&#xff0c;如果没有&#xff0c;需要重新安装&#xff0c;使用 yum install kde-l10n-Chinese 2、 修改 i18n 和 locale…

C++奇淫巧计:如何自助控制对象的初始化和销毁

需求 我们需要一个对象时&#xff0c;new 出来后自动根据需求&#xff0c;或是默认构造函数或是拷贝构造函数或是隐式转换&#xff0c;拿到手后就能用&#xff0c;习以为常。 但我们其实可以精确控制 new 的两个行为——内存分配、内存初始化。 代码 #include <iostream…

Mac OS中创建适合网络备份的加密镜像文件:详细步骤与参数选择

这篇文章提供了在Mac OS中创建适合网络备份的加密镜像文件的详细步骤&#xff0c;同时探讨了在选择相关参数时的关键考虑因素&#xff0c;以确保用户能够安全、高效地存储和保护重要数据。 创建步骤 在Mac OS Monterey中&#xff0c;你可以使用“磁盘工具”&#xff08;Disk …

【C++】初始化列表--再谈构造函数

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

PXI-1 Peripheral Module 64Bit 改混合槽 PXI Express Hybrid Slot

PXI PXIEPXI_LBR05VauxPXI_LBR2WAKE#PXI_LBR3ALERT#PXI_LBR412VPXI_LBR512VPXI_LBRL0/PXI_STAR0GNDPXI_LBRL1/PXI_STAR1GNDPXI_LBRL2/PXI_STAR2GNDPXI_LBRL3/PXI_STAR33.3VPXI_LBRL4/PXI_STAR43.3VPXI_LBRL5/PXI_STAR53.3V 实际就是拆掉这个 红黄框里的端子。。

UE4 C++ 动态加载类和资源

动态加载类和资源&#xff1a;指在运行时加载 .cpp void AMyActor::BeginPlay() {Super::BeginPlay();//动态加载资源UStaticMesh* MyTempStaticMesh LoadObject<UStaticMesh>(nullptr,TEXT("/Script/Engine.StaticMesh/Game/StarterContent/Shapes/Shape_NarrowC…

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---03信号(软件中断)源码分析

信号 实际使用看这一个 #if defined(RT_USING_SIGNALS)rt_sigset_t sig_pending; /**< the pending signals 记录来了的信号 */rt_sigset_t sig_mask; /**< the mask bits of signal 记录屏蔽的信号 */rt_sigh…

Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案

声明:原创文章,禁止转载! Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案 分析Android11 系统对于EMMC/UFS作为内部存储、SD卡被格式化为内部存储、SD卡/U盘被格式化为便携式存储的不同处理 一.现象描述 实测Android9 Android10 A…

Aigtek高精度电压源什么作用

高精度电压源是一种能够提供稳定、可靠且精确的电压输出的电子设备。它在科学研究、工程应用和制造业中起着至关重要的作用。以下将详细介绍高精度电压源的作用及其在不同领域的应用。 一、工作原理 稳定性&#xff1a;高精度电压源通常采用精密的电路设计和稳压技术&#xff0…

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它提供了许多特色功能&#xff0c;帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能&#xff1a; 智能代码编辑器&…