Unity Shader - Curved World - 类似 地铁跑酷,动物森友会 的世界扭曲效果 - 球形透视

news2024/10/10 2:18:50

我发现莉莉丝的《神觉者》在战斗中也有使用到这个效果,视觉效果提升还是很大的


比如,球形投影前的效果
在这里插入图片描述

球形投影后的效果
在这里插入图片描述

GIF:
请添加图片描述


ShaderLab cginc


固定 Vector.forward 方向的球形透视

参考: Shader in Unity & Curved world shader & Change material color 实现的效果

实现的只能是 Vector.forward 方向的球形投影

#ifndef __CURVE_WORLD_LIB_H__
#define __CURVE_WORLD_LIB_H__

// jave.lin 2023/02/01 curve world library

    #ifdef _CURVE_WORLD_ON

        uniform float _Curve_Depth;
        uniform float _Depth_Divider;

        void CurveWorldApply(inout float3 positionWS, out float3 positionOS)
        {
            float3 deltaVec = positionWS - _WorldSpaceCameraPos.xyz;
            float  E = -_Curve_Depth * _Depth_Divider;
            float  detlaVecZ2 = deltaVec.z * deltaVec.z;
            detlaVecZ2 *= E;
            float3 offset = float3(0.0, detlaVecZ2, 0.0);
            positionWS += offset;
            positionOS = mul(unity_WorldToObject, float4(positionWS, 1.0)).xyz;
        }

        #define CURVE_WORLD_APPLY(positionWS, positionOS) CurveWorldApply(positionWS, positionOS);

    #else

        #define CURVE_WORLD_APPLY(positionWS, positionOS)

    #endif

#endif

根据镜头任意视角方向的球形透视

#ifndef __CURVE_WORLD_LIB_H__
#define __CURVE_WORLD_LIB_H__

// jave.lin 2023/02/01 curve world library

    #ifdef _CURVE_WORLD_ON

        uniform float _Curve_Depth;
        uniform float _Depth_Divider;
        //uniform int _CW_Enabled;

        void CurveWorldApply(inout float3 positionWS, out float3 positionOS)
        {
            //float3 srcPosWS = positionWS;
            //float3 srcPosOS = positionOS;

            // jave.lin : zDist ref to : AutoLight.cginc

            float3 deltaVec = _WorldSpaceCameraPos - positionWS;
            float zDist = dot(deltaVec, UNITY_MATRIX_V[2].xyz);
            float  E = -_Curve_Depth * _Depth_Divider;
            float  zDist2 = zDist * zDist;
            zDist2 *= E;
            float3 offset = float3(0.0, zDist2, 0.0);
            positionWS += offset;
            positionOS = mul(unity_WorldToObject, float4(positionWS, 1.0)).xyz;

            //positionWS = lerp(srcPosWS, positionWS, _CW_Enabled);
            //positionOS = lerp(srcPosOS, positionOS, _CW_Enabled);
        }

        #define CURVE_WORLD_APPLY(positionWS, positionOS) CurveWorldApply(positionWS, positionOS);

    #else

        #define CURVE_WORLD_APPLY(positionWS, positionOS)

    #endif

#endif

CurveWorldControl.cs

// jave.lin : curve world control

using UnityEngine;

[ExecuteInEditMode]
public class CurveWorldControl : MonoBehaviour
{
    private bool _last_on = false;
    public bool on = true;
    [Range(0.005f, 1.0f)]
    public float curveDepth = 0.015f;
    public float depthDivider = 0.0f;

    private static int _Curve_Depth = Shader.PropertyToID("_Curve_Depth");
    private static int _Depth_Divider = Shader.PropertyToID("_Depth_Divider");
    private void Update()
    {
        if (_last_on != on)
        {
            if (on)
            {
                _Curve_Depth = Shader.PropertyToID("_Curve_Depth");
                _Depth_Divider = Shader.PropertyToID("_Depth_Divider");
                Shader.EnableKeyword("_CURVE_WORLD_ON");
            }
            else
            {
                Shader.DisableKeyword("_CURVE_WORLD_ON");
            }
            _last_on = on;
        }

        if (_last_on)
        {
            Shader.SetGlobalFloat(_Curve_Depth, curveDepth);
            Shader.SetGlobalFloat(_Depth_Divider, depthDivider);
        }
    }
}

需要修改的代码

修改所有 3D shader 即可

  1. pass添加代码:
  • #pragma multi_compile _ _CURVE_WORLD_ON
  • #include “CurveWorldLib.cginc”
  • CURVE_WORLD_APPLY(posWorld.xyz, v.vertex.xyz)
  1. 要添加的pass
  • ForwardBase
  • ForwardAdd
  • ShadowCaster
  1. CurveWorldControl.cs 的 DontDestryOnLoad
  2. 对应场景才开启 CurveWorldControl

Project

TestingSphereProjectionEffect - 参考: Shader in Unity & Curved world shader & Change material color 实现的效果


References

全部看完,相信你可以做一款很有意思的游戏,或是游戏中很有特色的效果

  • 英文搜索关键字:
    • 油管搜索关键字: curved-world
    • google : curved-world
  • Shader in Unity & Curved world shader & Change material color
  • Mobile Optimized Curve Shader for Mobile Games || Universal Render Pipeline || Shader Graph
  • Curved World shader bending
  • curved world using vertex shaders, #threejs, #glsl
  • Making of SHRINKING PLANET - Ludum Dare 38
  • Make Awesome Curved Worlds! - Code Monkey 大佬的
  • Animal Crossing World Bending Effect | Shader Graph | Unity Tutorial
  • Curved World
  • Unity Endless Game - Part 16: Post Processing & Curved Shader

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

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

相关文章

Nacos学习:二、配置中心

2. 配置中心 配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。 配置中心的服务流程如下: 1、用户在配置中心更新配置信息。 2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。 …

uni-app - H5 网站项目接入集成 51LA 网站统计详细教程(提供 51LA.js 官方插件与引入教程)

前言 如果您需要 Nuxt.js H5 网站项目的引入方式,请访问:Nuxt.js - 网站项目接入 51LA 网站统计 这个需求不常见,网上几乎没有教程,本文来做最新最好用的引入方案。 本文实现了 uniapp 开发的 H5 网页项目,要求接入 51LA 网站统计 的需求, 跟着本文,简简单单的几个步骤…

【HTML】有趣的代码合集(附源码)

文末有源码下载, “窝” 不信你全都看不上 文章目录CSS3 登录表单 个性化登录按钮可爱的CSS3圆盘时钟动画jQuery登录表单CSS3超酷弹出对话框 兼容移动端HTML5翻牌消除小游戏交互式分享按钮 可横向展开HTML5文件上传美化表单 支持拖拽上传纯CSS3加载Loading动画图 12…

unity怎样让玩家在不同材质上行走具有不同脚步声音效

问题:玩家在草地,雪地,木板上行走需要不同的脚步声音效,且无论行走还是奔跑,音效都要和脚步动画同步.思路:在动画上添加事件触发脚步声音效,并判断地面的材质然后播放不同的音效.实现:一.判断地面材质第一种情况是在unity内置terrain上行走地面有草地,石地,木地等,需要有不同音…

【蓝桥杯】历届试题 成绩统计(省赛)Java

【资源限制】 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 【问题描述】 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。…

计算机网络概念:

CDN:全国各地因为距离,加速响应,也因此可以节省带宽成本.DNS:域名解析器OSI七层模型:应用层:类比填写的数据报文表示层:类比浏览器层会话层:类比cookie或者token记录上次信息传输层:所谓的三次握手和四次挥手发生在这一层,进程到进程网络层:类似于ip通过路由器找到另一ip,服务器…

Web3中文|元宇宙如何更具包容性?

一旦新技术在发展过程中发生意外,受到最大伤害的往往会是边缘化的群体。 打个比方,自动决定内容访问权限和图像阐释方式的算法实际上受到了种族主义和性别歧视的影响。而拥有多种边缘化身份的人通常面临更大的风险。 这就是为什么当我听到马克扎克伯格…

Linux系统Shell脚本第六章:文件三剑客之sed

目录 一、文本三剑客之sed 1、基本用法 2、sed脚本语法及命令 3、sed选项 4、sed的查找替换使用 5、后向引用 6、变量 一、文本三剑客之sed 1、基本用法 sed [选项]... {自身脚本语法};.... [input file...] 举例: seq 5 |sed #生成1-5数字传给sed #该…

配置python虚拟环境配置【Pycharm为例】 2023年2月1日 14点43分

文章目录1. 新建一个项目2. 新建文件,创建项目3. 此时文件结构4. 安装环境样例5. 检查当前环境点击【解释器设置】点击同开头设置环境6. 开始安装根目录下有这个文件点击【终端】7. 激活虚拟环境7.1 如果出现以下错误([参考链接](https://blog.csdn.net/e5pool/arti…

大数据是干什么的,TOOM大数据舆情监测系统数据挖掘

舆情数据挖掘是指从大量的舆情数据中,通过使用数据挖掘、机器学习等技术,对舆情数据进行分析处理,提取有价值的信息,从而得到舆情分析结果。舆情数据挖掘的目的是了解舆论趋势、话题热点、网民情绪等,为决策提供数据支…

PowerBI实用技巧——利用DATEDIFF实现时间进度百分比

需求概述:根据系统默认时间当年1月~当年12月为一年(或指定财年)进行时间百分比进度展示。一、默认正常时间进度实现效果,例如现在系统是2023年2月1日,截止当前年时间已经过去了全年的8.49%.1.解决思路:首先…

【Faster R-CNN】之 backbone 代码精读

1、前言 在上一篇文章 【Faster R-CNN】之 Resize_and_Padding 代码精读 中,我们得到了图像尺寸统一的 batch 了,接下来,就是 feed 到 backbone 中 获取 feature map。 2、backbone 1)这里的 backbone 其实就是 迁移学习&#…

什么是数据治理?

我们这些搞数据治理的人,几乎每天都会说到“数据治理”这个词。但有很多人依然不清楚数据治理的确切含义,也搞不懂数据治理和数据管理的关系。这一节,我们就来认真辨析“数据治理”这个词。首先,我们来看一看国际数据管理协会DAMA…

C语言学习笔记-条件判断

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 fals…

python基础学习2--模块、面向对象编程

一、模块 在python中,一个.py文件就称之为一个模块(module)。为了避免模块重名冲突,pyton又引入了按目录来组织模块的方法,成为包(package)。 比如mycompany,按照如下目录存放: 引入了包以后,只…

【JavaGuide面试总结】Spring篇·上

【JavaGuide面试总结】Spring篇上1.谈谈自己对于 Spring IoC 的了解2.什么是 Spring Bean?3.将一个类声明为 Bean 的注解有哪些?4.注入 Bean 的注解有哪些?5.Component 和 Bean 的区别是什么?6.Autowired 和 Resource 的区别是什么&#xff…

私服 Nexus

Sonatype公司的一款maven私服产品。 下载地址: https://help.sonatype.com/repomanager3/download 启动命令: nexus.exe /run nexus 访问服务器(默认端口:8081): http://localhost:8081 提示信息有密码所在…

【IoT】红外循迹避障小车

说明 随着生产自动化的发展需要,机器人已经越来越广泛地应用到生产自动化上,随着科学技术的发展,机器人的传感器种类也越来越多,其中红外传感器已经成为自动行走和驾驶的重要部件。 红外的典型应用领域为自主式智能导航系统&…

Unity开发入门吐血反思

年前Team Leader开会时曾说道,以后我们可能都要去参与Unity开发,当时我还兴致勃勃一连提了好几个问题,有没有领路人,文档是否充分等等,毕竟做Android之余多掌握门技术也不错,学到的就是赚到的,技…

倚天剑第一式——爬虫基础

博主简介:博主是一个大二学生,主攻人工智能领域研究。感谢缘分让我们在CSDN相遇,博主致力于在这里分享关于人工智能,C,python,爬虫等方面的知识分享。如果有需要的小伙伴,可以关注博主&#xff…