Unity引擎使用InteriorCubeMap采样制作假室内效果

Unity引擎制作假室内效果

  大家好,我是阿赵。
  这次来介绍一种使用CubeMap做假室内效果的方式。这种技术名叫InteriorCubeMap,是UE引擎自带的节点效果。我这里是在Unity引擎里面的实现。

一、效果展示

这个假室内效果,要动态看才能看出效果,各位可以看看上面的视频
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  简单来说,从不同的角度看这个面片,看到的里面的内容会随着视角的变化而变化,感觉好像从窗外观看室内的效果。

二、原理分析

在这里插入图片描述

实际上,并没有什么室内效果,那些都是一个一个的面片来的。
在这里插入图片描述

  面片所显示的内容,其实是CubeMap贴图。
  CubeMap贴图的用法之前在写天空盒变化的文章里面介绍过,各位可以去看看:
  https://blog.csdn.net/liweizhao/article/details/129603219
  当时的CubeMap采样时通过计算世界空间的ViewDir和世界空间的法线方向来做的

float3 worldViewDir = UnityWorldSpaceViewDir(i.worldPos);
worldViewDir = normalize(worldViewDir);
float3 worldReflect = reflect(worldViewDir,i.worldNormal);
float4 col = texCUBE(_SkyTex1, worldReflect);

  所以如果使用在一个面片上面,也能做到里面的内容跟随这视角变化而变化,但由于面片的法线方向都是朝着同一个方向的,所以显示在上面的CubeMap是一个平面的效果。
但这个InteriorCubeMap的计算采样CubeMap的UV的方式比较特别,它会模拟成一个方形来采样CubeMap。
  我把这个InteriorCubeMap节点的代码模拟成一个方法,求出一个采样的UV:

float3 InteriorCubeMap(float3 worldPosition,  float3 worldTangent,float3 worldNormal,float3 worldBitangent,float2 uv)
{float3 tanToWorld0 = float3(worldTangent.x, worldBitangent.x, worldNormal.x);float3 tanToWorld1 = float3(worldTangent.y, worldBitangent.y, worldNormal.y);float3 tanToWorld2 = float3(worldTangent.z, worldBitangent.z, worldNormal.z);float3 worldViewDir = UnityWorldSpaceViewDir(worldPosition);worldViewDir = normalize(worldViewDir);float3 tanViewDir = tanToWorld0 * worldViewDir.x + tanToWorld1 * worldViewDir.y + tanToWorld2 * worldViewDir.z;tanViewDir = Unity_SafeNormalize(tanViewDir);float3 step1Val = (float3(-1, -1, 1) * tanViewDir);float3 step2Val = (1.0 / step1Val);float3 step3Val = (float3(((frac(((uv * float2(1, -1)) * (_Tilling).xx)) * float2(2, -2)) - float2(1, -1)), -1.0*_Depth));float3 step4Val = (abs(step2Val) - (step2Val * step3Val));float3 step5Val = ((min(min(step4Val.x, step4Val.y), step4Val.z) * step1Val) + step3Val);return (float3(step5Val.z, step5Val.x, step5Val.y));
}

在这里插入图片描述

  通过调节Depth参数,可以模拟不同深度的室内效果。
在这里插入图片描述

  通过调节Tilling平铺次数,可以模拟多个相同的房间放在一起的效果。

三、代码

Shader "azhao/InteriorCubeMapTest"
{Properties{_Tilling("Tilling", Vector) = (1,1,1,1)_CubeTex("Texture Sample 0", CUBE) = "white" {}_Depth("Depth",Range(0,5)) = 1}SubShader{Tags { "RenderType" = "Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "UnityStandardBRDF.cginc"struct appdata{float4 vertex : POSITION;float4 color : COLOR;float4 tangent : TANGENT;float3 normal : NORMAL;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 worldPos : TEXCOORD1;float3 worldTangent : TEXCOORD2;float3 worldNormal : TEXCOORD3;float3 worldBitangent : TEXCOORD4;};samplerCUBE _CubeTex;float2 _Tilling;float _Depth;float3 InteriorCubeMap(float3 worldPosition,  float3 worldTangent,float3 worldNormal,float3 worldBitangent,float2 uv){float3 tanToWorld0 = float3(worldTangent.x, worldBitangent.x, worldNormal.x);float3 tanToWorld1 = float3(worldTangent.y, worldBitangent.y, worldNormal.y);float3 tanToWorld2 = float3(worldTangent.z, worldBitangent.z, worldNormal.z);float3 worldViewDir = UnityWorldSpaceViewDir(worldPosition);worldViewDir = normalize(worldViewDir);float3 tanViewDir = tanToWorld0 * worldViewDir.x + tanToWorld1 * worldViewDir.y + tanToWorld2 * worldViewDir.z;tanViewDir = Unity_SafeNormalize(tanViewDir);float3 step1Val = (float3(-1, -1, 1) * tanViewDir);float3 step2Val = (1.0 / step1Val);float3 step3Val = (float3(((frac(((uv * float2(1, -1)) * (_Tilling).xy)) * float2(2, -2)) - float2(1, -1)), -1.0*_Depth));float3 step4Val = (abs(step2Val) - (step2Val * step3Val));float3 step5Val = ((min(min(step4Val.x, step4Val.y), step4Val.z) * step1Val) + step3Val);return (float3(step5Val.z, step5Val.x, step5Val.y));}v2f vert(appdata v){v2f o;o.worldTangent = UnityObjectToWorldDir(v.tangent);o.worldNormal = UnityObjectToWorldNormal(v.normal);float vertexTangentSign = v.tangent.w * unity_WorldTransformParams.w;float3 worldBitangent = cross(o.worldNormal, o.worldTangent) * vertexTangentSign;o.worldBitangent.xyz = worldBitangent;o.uv = v.uv;o.vertex = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}half4 frag(v2f i) : SV_Target		{float3 cubeUV = InteriorCubeMap(i.worldPos,i.worldTangent, i.worldNormal, i.worldBitangent, i.uv);half4 finalColor = texCUBE(_CubeTex, cubeUV);return finalColor;}ENDCG}}}

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

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

相关文章

柏睿向量数据库Rapids VectorDB赋能企业级大模型构建及智能应用

ChatGPT的问世,在为沉寂已久的人工智能重新注入活力的同时,也把长期默默无闻的向量数据库推上舞台。今年4月以来,全球已有4家知名向量数据库公司先后获得融资,更加印证了向量数据库在AI大模型时代的价值。 什么是向量数据库? 在认识向量数据库前,先来了解一下最常见的关…

【业务功能篇62】Spring boot maven多模块打包时子模块报错问题

程序包 com.xxx.common.utils不存在或者xxx找不到符号 我们项目中一般都是会分成多个module模块,做到解耦,方便后续做微服务拆分模块,可以直接就每个模块进行打包拎出来执行部署这样就会有模块之间的调用,比如API模块会被Service…

【SpringBoot】SpringBoot获取不到用户真实IP怎么办

文章目录 前言问题原因解决方案修改Nginx配置文件SpringBoot代码实现 前言 项目部署后发现服务端无法获取到客户端真实的IP地址,这是怎么回事呢?给我都整懵逼了,经过短暂的思考,我发现了问题的真凶,那就是我们使用了N…

Vue基础

Vue基础 Vue应用 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><!-- 开发环境版本 --><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head&g…

vue所有UI库通用)tree-select 下拉多选(设置 maxTagPlaceholder 隐藏 tag 时显示的内容,支持鼠标悬浮展示更多

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 引用的下拉树形结构支持多选&#xff0c;限制选中tag的个数&#xff0c;且超过制定个数&#xff0c;鼠标悬浮展示更多已选中。 2.先看下效果图 3.实现思路 首先根据API文档&#xff0c;先设置maxTagC…

【Docker】Docker network之bridge、host、none、container以及自定义网络的详细讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

TCP/IP网络江湖初探:物理层的奥秘与传承(物理层上篇-基础与本质)

〇、引言 在这个数字时代,计算机网络如同广袤的江湖,数据在其中畅游,信息传递成为了生活的常态。然而,在这个充满虚拟奇观的网络江湖中,隐藏着一个不容忽视的存在,那就是物理层,这个江湖的基石。就如同江湖中的土地一样,物理层作为计算机网络的基础,承载着数据的最初转…

STM32 CubeMX (uart_IAP串口)简单示例

STM32 CubeMX STM32 CubeMX &#xff08;串口IAP&#xff09; STM32 CubeMXIAP有什么用&#xff1f;整体思路 一、STM32 CubeMX 设置时钟树UART使能UART初始化设置 二、代码部分文件移植![在这里插入图片描述](https://img-blog.csdnimg.cn/0c4841d8328b4169a8833f15fe3d670c.p…

PHP Smarty中的缓存如何实现?

欢迎来到PHP Smarty的缓存世界&#xff01;这里是一个简单的指南&#xff0c;帮助你理解如何在这个强大的模板引擎中启用和配置缓存。 首先&#xff0c;让我们先了解一下什么是缓存。简单来说&#xff0c;缓存就是将需要花费大量时间处理的数据或资源存储起来&#xff0c;以便…

2023/8/16总结

这几天完成了私信的功能点&#xff0c;用websocket做的。 这是大概的界面&#xff0c;参考的是微信 用户可以搜索好友&#xff1a; 如果不存在是下面这样&#xff0c;存在就会在左边的聊天里面显示有这个人选项 发送消息 接下来需要把推荐算法给做了

文件IO编程 1 2

头文件包含路径 linux 操作系统分为两大空间&#xff1a;用户空间和内核空间 这样划分&#xff0c;是为了保护内核的核心组件&#xff0c;不被轻易访问和修改 系统调用&#xff1a;安全的访问内核空间 其核心是&#xff1a;函数API&#xff08;API&#xff1a;用户编程接口&…

svn文章五:问题排查与修复 - 出了问题怎么办?SVN故障排除与修复指南

文章五&#xff1a;问题排查与修复 - “出了问题怎么办&#xff1f;SVN故障排除与修复指南” 概述&#xff1a;在使用SVN时&#xff0c;难免会遇到一些问题和错误。在这篇文章中&#xff0c;我们将教您如何进行故障排查和修复&#xff0c;保护您的SVN仓库和数据安全。 1. 引言…

K8S系列文章之 Docker安装使用Kafka

通过Docker拉取镜像的方式进行安装 照例先去DockerHub找一下镜像源&#xff0c;看下官方提供的基本操作&#xff08;大部分时候官方教程比网上的要清晰一些&#xff0c;并且大部分教程可能也是翻译的官方的操作步骤&#xff0c;所以直接看官方的就行&#xff09; 老实说Kafka…

“深入剖析JVM内部原理:解密Java虚拟机的奥秘“

标题&#xff1a;深入剖析JVM内部原理&#xff1a;解密Java虚拟机的奥秘 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的内部原理&#xff0c;包括其架构、内存管理、垃圾回收机制、即时编译器等关键组成部分。通过解密JVM的奥秘&#xff0c;我们将更…

【Vue3】Vue3 UI 框架 | Element Plus —— 创建并优化表单

安装 # NPM $ npm install element-plus --save // 或者&#xff08;下载慢切换国内镜像&#xff09; $ npm install element-plus -S// 可以选择性安装 less npm install less less-loader -D // 可以选择性配置 自动联想src目录Element Plus 的引入和注入 main.ts import…

解决VSCode CPU高占问题的方法

如果你也遇到VSCode的CPU占用过高的问题&#xff0c;可以尝试使用官方自带的插件Bisect&#xff08;扩展二分查找&#xff09;功能来查找具体是哪个扩展出了问题。 找到“糟糕”的扩展可能很容易&#xff0c;也可能很困难。 打开扩展视图 ( CtrlShiftX )&#xff0c;禁用扩展&…

网络:杂记

1. 完成链路认证后&#xff0c;STA会继续发起链路服务协商&#xff0c;具体的协商是通过Association报文实现。 2. RSTP可以提高收敛速度的原因&#xff1a; RSTP的拓扑变化机制 Proposal/Agreement机制 根端口快速切换机制 边缘端口的引入

git cherry-pick

cherry-pick命令的基本用法 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是常见需求。这时分两种情况。一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用合并&#xff08; git merge &#xff09;。另一种情况是&#xff0c;…

总结 TCP 协议的相关特性

TCP协议段格式: 如图, 端口号: 是其中一个重要的部分,知道端口号才能确认数据交给哪个应用程序(端口号属于传输层的概念). 4位首部长度:4bit表示的范围是0->15,在此处,单位是"4字节",因此,将这里的数值 * 4&#xff0c;才是真正的报头长度,即TCP 报头最大长度,60…

Cenos7 搭建Minio最新版集群部署服务器(一)

------> 道 | 法 | 术 | 器 | 势 <------ 多台服务器间免密登录|免密拷贝 Cenos7 搭建Minio集群部署服务器(一) Cenos7 搭建Minio集群Nginx统一访问入口|反向动态代理(二) Spring Boot 与Minio整合实现文件上传与下载(三) CentOS7的journalctl日志查看方法 …