Unity Shader - Curved World - 类似 地铁跑酷,动物森友会 的世界扭曲效果 - 球形透视
文章目录
- ShaderLab cginc
- 固定 Vector.forward 方向的球形透视
- 根据镜头任意视角方向的球形透视
- 添加开始弯曲透视的 z 距离偏移
- CurveWorldControl.cs
- 需要修改的代码
- Project
- References
我发现莉莉丝的《神觉者》在战斗中也有使用到这个效果,视觉效果提升还是很大的
比如,球形投影前的效果
球形投影后的效果
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_ONuniform 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_ONuniform float _Curve_Depth;uniform float _Depth_Divider;//uniform int _CW_Enabled;uniform float4 _Cam_Forward;void CurveWorldApply(inout float3 positionWS, out float3 positionOS){//float3 srcPosWS = positionWS;//float3 srcPosOS = positionOS;// jave.lin : zDist ref to : AutoLight.cgincfloat3 deltaVec = _WorldSpaceCameraPos - positionWS;//float zDist = dot(deltaVec, UNITY_MATRIX_V[2].xyz);float zDist = dot(deltaVec, _Cam_Forward.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
添加开始弯曲透视的 z 距离偏移
留意: uniform float _Z_Dist_Offset;
#ifndef __CURVE_WORLD_LIB_H__
#define __CURVE_WORLD_LIB_H__// jave.lin 2023/02/01 curve world library#ifdef _CURVE_WORLD_ONuniform float _Curve_Depth;uniform float _Depth_Divider;//uniform int _CW_Enabled;uniform float4 _Cam_Forward;uniform float _Z_Dist_Offset;void CurveWorldApply(inout float3 positionWS, out float3 positionOS){//float3 srcPosWS = positionWS;//float3 srcPosOS = positionOS;// jave.lin : zDist ref to : AutoLight.cgincfloat3 deltaVec = _WorldSpaceCameraPos - positionWS;//float zDist = dot(deltaVec, UNITY_MATRIX_V[2].xyz);float zDist = max(0, dot(deltaVec, _Cam_Forward.xyz) - _Z_Dist_Offset);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 controlusing 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;public Camera cam;private static int _Curve_Depth = Shader.PropertyToID("_Curve_Depth");private static int _Depth_Divider = Shader.PropertyToID("_Depth_Divider");private static int _Cam_Forward = Shader.PropertyToID("_Cam_Forward");private void Update(){if (cam == null){Shader.DisableKeyword("_CURVE_WORLD_ON");return;}if (_last_on != on){if (on){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);var view_forward = cam.worldToCameraMatrix.GetColumn(2);Shader.SetGlobalVector(_Cam_Forward, view_forward);}}
}
需要修改的代码
修改所有 3D shader 即可
- pass添加代码:
- #pragma multi_compile _ _CURVE_WORLD_ON
- #include “CurveWorldLib.cginc”
- CURVE_WORLD_APPLY(posWorld.xyz, v.vertex.xyz)
- 要添加的pass
- ForwardBase
- ForwardAdd
- ShadowCaster
- CurveWorldControl.cs 的 DontDestryOnLoad
- 对应场景才开启 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
Unity Shader - Curved World - 类似 地铁跑酷,动物森友会 的世界扭曲效果 - 球形透视相关推荐
- Unity Shader 之 简单实现折叠平面(翻书)的效果
Unity Shader 之 简单实现折叠平面(翻书)的效果 目录 Unity Shader 之 简单实现折叠平面(翻书)的效果 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 五.实现步骤 ...
- (十六)unity shader之——————高级纹理之渲染纹理(镜子、玻璃效果)
在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上.现在的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render Target Texture,RTT ...
- unity shader学习---透明度测试,透明度混合
unity实现透明效果 效果图 理论 Alpha Test Alpha Blend 改进 开启深度写入的半透明效果 双面渲染的透明效果 代码部分 效果图 Alpha Test Alpha Test W ...
- 在unity用shaderGraph做出类似动物之森的柱面场景,甚至球面场景。
在unity用shaderGraph做出类似动物之森的柱状场景,甚至球状场景. 这个是模仿油管上NotSlot的视频https://www.youtube.com/watch?v=SOK3Ias5Nk ...
- Unity Shader - 实现类似镜面反射、水面扰动效果
前几天,家里出了一些问题,搞得心情很不好,面试我也取消了. 唉,反正那个伤心啊,不过,昨天处理好了. 所以说啊,家和万事兴. 加油加油!!! 所以心情好了,我又写博客了. 另外说一下:图形我今年201 ...
- 如何用Unity Shader制作类似《炉石传说》卡牌的动态效果?
此篇为鄙人在卡牌项目中,尝试模仿<炉石传说>卡面特效所制作的特效Shader总结回顾,几经修改,最终成为了现在的样子,因为使用简单,效果明显,虽然距离<炉石传说>的卡面特效还有 ...
- Unity Shader - 类似七龙珠的人物气焰效果
文章目录 环境 效果 思路 passes pass - 气焰 优化后的 shader Project 关于效果落地 环境 Unity : 2018.3.11f1 Pipeline : BRP 效果 覆 ...
- 有人要在「动物森友会」上开AI学术会议,我看你们就是在家想玩游戏吧
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI <动物森友会>这个游戏,任天堂400块钱卖给你们真是亏大了. 本来是一款社交养成类游戏,被大家玩成了cosplay现实世界.有 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
最新文章
- Windows下更改mysql data目录
- 两个vlan之间如何通信_如何桥接两个不同的VLAN?
- 方便食品直接上菜 自嗨锅和西贝哪来的勇气?
- 理解Android Binder机制(1/3):驱动篇
- QT的QHashIterator类的使用
- C# 把字符串类型日期转换为日期类型
- 计算机网络常见问题总结
- c++中,可以用类名直接访问非静态成员函数?
- Delphi面向对象学习随笔七:COM
- unity, 同步物体坐标一定要在LateUpdate中进行
- STC51单片机中断介绍
- 2020.12.28Excel(数字到BZZ)
- 2022年潜江中级工程师职称申报材料和申报渠道是什么呢?甘建二
- u8显示服务器资源不足,系统提示“虚拟内存不足”的原因及解决方法
- Python点击Pycharm按钮Run的时候出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
- 煦涵说Webpack-IE低版本兼容指南
- 8个身家百万的儿童创业者
- Java键盘监听器KeyListener
- insmod modprobe
- 数字科技行业的“挖井人”:京东数科不做一锤子买卖
热门文章
- 读取json格式的图片、文字并保存成图片
- 简介 传输层协议——UDP协议
- 餐饮供应链管理系统解决方案
- Firefox 无法拖拽搜索
- DirectX12(D3D12)基础教程(外篇一)——编译Assimp
- There is no map catalog on the database. Please first create Map Catlog
- 7500 cpuz跑分 i5_i57500怎么样_i57500评测、跑分、价格、参数、图片 - 系统家园
- Python 基础 - 第三方模块PyYAML
- ffmpeg图片序列转视频或者GIF
- UR3e+robotiq+抓取仿真实验