Unity实现“笼中窥梦”的渲染效果
2021-12-13 11:23
781 查看
效果
思路
5个面用5个RenderTexture来接受5个摄像机分别获取的小场景图像;
RenderTexture就当成屏幕来理解,MainCamera是把画面显示在屏幕上,屏幕就是最大的RenderTexture且允许里面有子渲染;
把子摄像机拍摄到的画面当成纹理贴图理解,RenderTexture是从子摄像机画面上取样再根据宽高比缩放显示画面;
RenderTexture贴图是不会跟据面与主摄像机位置改变做变化的(其实可以理解为公告牌,这个贴图里的内容一直朝向主摄像机);
要实现上面的效果,在主摄像机空间下,顶点着色器阶段记录裁剪空间下顶点投影到屏幕的坐标,在片元着色器阶段,根据上面记录的屏幕坐标归一化到NDC坐标系(透视除法),再映射根据游戏窗口大小做缩放(屏幕映射),根据这个结果做纹理采样;
Shader代码:
Shader "Unlit/WindowsShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _ScreenHW ("ScreenHW", Float) = 0.5521 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex :SV_POSITION; float4 screenPos :TEXCOORD1; }; sampler2D _MainTex; float _ScreenHW; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.screenPos = ComputeScreenPos(o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { float2 screenPos = i.screenPos.xy / i.screenPos.w; float2 uv = screenPos.xy * float2(1, _ScreenHW); fixed4 col = tex2D(_MainTex, uv); return col; } ENDCG } } }
具体实现细节可以看大佬的文章:在Unity中实现笼中窥梦的效果;
相关文章推荐
- Unity 对选中物体实现描边效果(方法1:指定layer的外轮廓渲染)
- 日式卡通渲染的效果的unity实现
- Unity 对选中物体实现描边效果(方法3:结合方法1的外轮廓渲染、方法2的选择网格)
- 【游戏渲染】unity海边波浪效果的实现
- 【小松教你手游开发】【游戏渲染】unity海边波浪效果的实现
- [学习笔记][3dsMax][Maya][Shaderfx]卡通渲染Outline效果实现
- Unity编程笔录--Unity+aipai实现录屏效果
- Unity光晕剑效果的Shader简单实现
- unity shader 实现自由放大缩小效果
- 实现正在竞价时和点击竞价时的不同的渲染页面效果!
- Unity 3D追踪效果的实现 目标箭头指引
- unity实现dialog效果教程
- Unity——Rigidbody实现真实的物体旋转效果/解决物体添加刚体后不随父物体移动/hingejoint
- Unity中实现灰度图效果
- 【Unity】代码实现视野的旋转和视野的拉近和拉远的效果
- Unity游戏开发技巧集锦2.1.3实现效果
- unity_NGUI系统学习(十四)_游戏界面滑动切换的效果实现(无代码实现)
- 【个人Unity笔记】{基础} DOTween快捷实现震屏效果
- 我的Unity(12) 利用LineRenderer实现画板效果
- 【unity】 shader的渲染次序 实现,水只倒影 场景,不要倒影角色。