Cg Programming/Unity/Diffuse Reflection of Skylight天窗漫反射

2024-03-11 09:08

本文主要是介绍Cg Programming/Unity/Diffuse Reflection of Skylight天窗漫反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本教程涵盖了半球光照。

它是基于章节“漫反射”中描述的漫射逐顶点光照。如果你还没有阅读过这章,建议你先看一下。

半球照明基本上是用一个覆盖整个半球包围着场景的巨大光源来计算漫射照明的,比如像天空。它通常包括从另一个半球使用不同颜色的照明,因为计算几乎是不用什么代价的。在下面的照片中,这座球形建筑物被阴沉沉的天空照亮了。但是,周围绿色的水池也照亮着它,最终导致了建筑下半部的明显的绿色照明。

这里写图片描述

半球光照

If the surface normal N points in the direction of U, we have full illumination with a color specified by the user. If there is an angle γ between them (i.e. cos(γ) = U·N), only a spherical wedge (see the Wikipedia article) of the hemisphere illuminates the surface point. The fraction w of this illumination in comparison to the full illumination is:
如果我们假设一个半球在平面某点周围的每一个点(在方向L上)作为一个光源,我们应该把半球上所有点处的漫射光照(由在章节“漫反射”中讨论的max(0, L·N)指定)整合到一起。让我们把半球旋转轴的归一化方向称为U(即”up”)。如果表面法向量N指向U方向,我们就会有用户指定颜色的完全照明。如果它们之间有个角度γ(即cos(γ) = U·N),只有半球的球面楔(参考维基百科的文章)可以解释这个表面点。与完全照明相比,这种照明的积分w是:
这里写图片描述

于是,我们可以计算入射光为w乘上用户指定的半球完全照明的颜色。在相反方向的半球将会用1-w乘以另外的颜色(如果我们不需要的话,它可能是黑色的)来照亮表面上的点。下面将会解释如何推导出w这个等式。

等式的推导

For anyone interested (and because I didn’t find it on the web) here is a derivation of the equation for w. We integrate the illumination over the hemisphere at distance 1 in a spherical coordinate system attached to the surface point with the direction of N in the direction of the y axis. If N and U point in the same direction, the integral is (apart from a constant color specified by the user):
任何一个人感兴趣的话(因为我在网上还没找到),以下是w这个方程的推导。我们将距离为1的半球上的照明与位于y轴方向上N方向表面点所在的球面坐标系相结合。如果N和U是在相同的方向,积分就是(除了由用户指定的常量颜色外):
这里写图片描述

sin(θ)项是我们的积分在半径为1的球体表面的雅可比行列式, (x, y, z) 是(cos(φ)sin(θ), sin(φ)sin(θ), cos(θ)),以及N = (0,1,0)。于是,这个积分就变成了:
这里写图片描述

The constant π will be included in the user-defined color of the maximum illumination. If there is an angle γ with cos(γ) = U·N between N and U, then the integration is only over a spherical wedge (from γ to π):
常量π将包含在最大照明的用户自定义的颜色中。如果N和U之间有一个角度γ ,那么这个积分就只是在球形楔上((从γ到π)):
这里写图片描述

着色器代码

代码实现是基于章节“漫反射”中的代码。在一个更详细的实现方案中,其它光源的贡献也会被包含进来,比如会使用章节“镜面高光”中提到的Phone反射模型。在那种情况下,半球光明可能会像环境光照一样以相同的方式被包含进来。

但是,这里半球光照就是唯一的照明。w的等式如下:
这里写图片描述

我们在世界空间中实现这个等式,也就是说我们必须把表面法向量N变换到世界空间中去(参考章节“世界空间中的着色器编程”),而U是由用户在世界空间中指定的。在使用w和1-w基于用户指定的颜色计算照明之前我们会归一化向量和计算w。实际上,这很简单。

Shader "Cg per-vertex hemisphere lighting" {Properties {_Color ("Diffuse Material Color", Color) = (1,1,1,1) _UpperHemisphereColor ("Upper Hemisphere Color", Color) = (1,1,1,1) _LowerHemisphereColor ("Lower Hemisphere Color", Color) = (1,1,1,1) _UpVector ("Up Vector", Vector) = (0,1,0,0) }SubShader {Pass {      CGPROGRAM#pragma vertex vert  #pragma fragment frag #include "UnityCG.cginc"// shader properties specified by usersuniform float4 _Color; uniform float4 _UpperHemisphereColor;uniform float4 _LowerHemisphereColor;uniform float4 _UpVector;struct vertexInput {float4 vertex : POSITION;float3 normal : NORMAL;};struct vertexOutput {float4 pos : SV_POSITION;float4 col : COLOR;//在顶点着色器中计算半球光照};vertexOutput vert(vertexInput input) {vertexOutput output;float4x4 modelMatrix = _Object2World;float4x4 modelMatrixInverse = _World2Object; float3 normalDirection = normalize(mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);float3 upDirection = normalize(_UpVector);float w = 0.5 * (1.0 + dot(upDirection, normalDirection));output.col = (w * _UpperHemisphereColor + (1.0 - w) * _LowerHemisphereColor) * _Color;output.pos = mul(UNITY_MATRIX_MVP, input.vertex);return output;}float4 frag(vertexOutput input) : COLOR{return input.col;}ENDCG}} 
}

总结

恭喜,你又完成了一章!我们看到了:
- 什么是半球光照。
- 半球光照的等式是什么。
- 如何实现一个半球光照。

这篇关于Cg Programming/Unity/Diffuse Reflection of Skylight天窗漫反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797357

相关文章

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源,你需要向加载方法传递一个键或键列表。键可以是以下对象之一: Address:包含你分配给资源的地址的字符串。Label:包含分配给一个或多个资源的标签的字符串。AssetReference Obj

在Unity环境中使用UTF-8编码

为什么要讨论这个问题         为了避免乱码和更好的跨平台         我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本,默认是看不到在VS中的编码格式,下面我介绍一种简单快

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)-CSDN博客 做完了数据结构类,该做一个存储类了,也就是生成一个字典类(只是声明)  实现和上一节的数据结构类的方式大同小异,所

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果,效果如下: Unity URP遮挡高亮 实现步骤 创建层级,为需要显示高亮效果的物体添加层级,比如Player 创建一个材质球,也就是高亮效果显示的材质球找到Universal Renderer Data Assets 4.在Assets上添加两个Render Objects组件 第一个做如下三处设置 指定遮挡层级指

【Unity面经】实习篇:面试官常问的一百个面试题

👨‍💻个人主页:@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧🟥Unity100个实战基础✨🎁🟦 Unity100个精华一记✨🎁🟩 Unity50个demo案例教程✨🎁🟨 Unity100个精华细节BUG✨🎁🟨 Unity100个面试题✨🎁 文章