文章目录

  • 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 即可

  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

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

  1. Unity Shader 之 简单实现折叠平面(翻书)的效果

    Unity Shader 之 简单实现折叠平面(翻书)的效果 目录 Unity Shader 之 简单实现折叠平面(翻书)的效果 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 五.实现步骤 ...

  2. (十六)unity shader之——————高级纹理之渲染纹理(镜子、玻璃效果)

    在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上.现在的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render Target Texture,RTT ...

  3. unity shader学习---透明度测试,透明度混合

    unity实现透明效果 效果图 理论 Alpha Test Alpha Blend 改进 开启深度写入的半透明效果 双面渲染的透明效果 代码部分 效果图 Alpha Test Alpha Test W ...

  4. 在unity用shaderGraph做出类似动物之森的柱面场景,甚至球面场景。

    在unity用shaderGraph做出类似动物之森的柱状场景,甚至球状场景. 这个是模仿油管上NotSlot的视频https://www.youtube.com/watch?v=SOK3Ias5Nk ...

  5. Unity Shader - 实现类似镜面反射、水面扰动效果

    前几天,家里出了一些问题,搞得心情很不好,面试我也取消了. 唉,反正那个伤心啊,不过,昨天处理好了. 所以说啊,家和万事兴. 加油加油!!! 所以心情好了,我又写博客了. 另外说一下:图形我今年201 ...

  6. 如何用Unity Shader制作类似《炉石传说》卡牌的动态效果?

    此篇为鄙人在卡牌项目中,尝试模仿<炉石传说>卡面特效所制作的特效Shader总结回顾,几经修改,最终成为了现在的样子,因为使用简单,效果明显,虽然距离<炉石传说>的卡面特效还有 ...

  7. Unity Shader - 类似七龙珠的人物气焰效果

    文章目录 环境 效果 思路 passes pass - 气焰 优化后的 shader Project 关于效果落地 环境 Unity : 2018.3.11f1 Pipeline : BRP 效果 覆 ...

  8. 有人要在「动物森友会」上开AI学术会议,我看你们就是在家想玩游戏吧

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI <动物森友会>这个游戏,任天堂400块钱卖给你们真是亏大了. 本来是一款社交养成类游戏,被大家玩成了cosplay现实世界.有 ...

  9. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

最新文章

  1. Windows下更改mysql data目录
  2. 两个vlan之间如何通信_如何桥接两个不同的VLAN?
  3. 方便食品直接上菜 自嗨锅和西贝哪来的勇气?
  4. 理解Android Binder机制(1/3):驱动篇
  5. QT的QHashIterator类的使用
  6. C# 把字符串类型日期转换为日期类型
  7. 计算机网络常见问题总结
  8. c++中,可以用类名直接访问非静态成员函数?
  9. Delphi面向对象学习随笔七:COM
  10. unity, 同步物体坐标一定要在LateUpdate中进行
  11. STC51单片机中断介绍
  12. 2020.12.28Excel(数字到BZZ)
  13. 2022年潜江中级工程师职称申报材料和申报渠道是什么呢?甘建二
  14. u8显示服务器资源不足,系统提示“虚拟内存不足”的原因及解决方法
  15. Python点击Pycharm按钮Run的时候出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
  16. 煦涵说Webpack-IE低版本兼容指南
  17. 8个身家百万的儿童创业者
  18. Java键盘监听器KeyListener
  19. insmod modprobe
  20. 数字科技行业的“挖井人”:京东数科不做一锤子买卖

热门文章

  1. 读取json格式的图片、文字并保存成图片
  2. 简介 传输层协议——UDP协议
  3. 餐饮供应链管理系统解决方案
  4. Firefox 无法拖拽搜索
  5. DirectX12(D3D12)基础教程(外篇一)——编译Assimp
  6. There is no map catalog on the database. Please first create Map Catlog
  7. 7500 cpuz跑分 i5_i57500怎么样_i57500评测、跑分、价格、参数、图片 - 系统家园
  8. Python 基础 - 第三方模块PyYAML
  9. ffmpeg图片序列转视频或者GIF
  10. UR3e+robotiq+抓取仿真实验