赞
踩
必须小心操作,确保摄像机的顺序不会导致过度绘制。
代码中动态修改摄像机类型
- var cameraData = camera.GetUniversalAdditionalCameraData();
- cameraData.renderType = CameraRenderType.Base;
-
创景(Scene)中的布局,五辆汽车并没有放在一起,但是在 Game视图中观看的时候,如下图所示:
单独看一下两个相机的视图:
Base:
必须通过摄像机堆叠系统将叠加摄像机与一个或多个基础摄像机结合使用。不能单独使用叠加摄像机。不在摄像机堆叠中的叠加摄像机不会执行其渲染循环的任何步骤。
可点击Stack下方的+号添加其他的Overlay相机,-号删除,选中上下拖动调整渲染顺序。
渲染器功能是一种资源,可让您将额外的渲染通道添加到 URP 渲染器并配置其行为。
URP 包含预构建的名为渲染对象 (Render Objects) 的渲染器功能。
下面讲述使用Render Objects 实现上面汽车的描边。
在Project窗口选中URP的配置文件UniversalRenderPipelineAsset_Renderer(我用的默认名字),在Inspector创建一个Render Objects.
创建好需要进行一些设置,这里来两张贴图简单解释一下面板参数:
我的Layer Mask 选中的是Car这个层,也就是说我当前的Render Objects只针对Car层的物体生效,那么可以看到上面的Game视图中只有前面两辆汽车有描边,其他的车我选的都是默认Default,所以不会被描边。
Toon_Basic Outline 这个材质引用的是官方demo里面的一段shader代码(选中shader文件右键新建Material 建好的材质会自动引用当前Shader),下面贴的就是:
- Shader "Toon/Basic Outline"
- {
- Properties
- {
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _Outline ("Outline width", Range (.002, 0.09)) = .005
- }
- SubShader
- {
- Tags { "RenderType"="Opaque" }
-
- Cull Front
- ZWrite On
- ColorMask RGB
- Blend SrcAlpha OneMinusSrcAlpha
-
- Pass
- {
- Name "OUTLINE"
-
- HLSLPROGRAM
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
-
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_fog
-
- CBUFFER_START(UnityPerMaterial)
- float _Outline;
- float4 _OutlineColor;
- CBUFFER_END
-
- struct Attributes
- {
- float4 positionOS : POSITION;
- float3 normalOS : NORMAL;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- };
-
- struct Varyings
- {
- float4 positionCS : SV_POSITION;
- half fogCoord : TEXCOORD0;
- half4 color : COLOR;
- UNITY_VERTEX_OUTPUT_STEREO
- };
-
- Varyings vert(Attributes input)
- {
- Varyings output = (Varyings)0;
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- input.positionOS.xyz += input.normalOS.xyz * _Outline;
-
- VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
- output.positionCS = vertexInput.positionCS;
-
- output.color = _OutlineColor;
- output.fogCoord = ComputeFogFactor(output.positionCS.z);
- return output;
- }
-
- half4 frag(Varyings i) : SV_Target
- {
- i.color.rgb = MixFog(i.color.rgb, i.fogCoord);
- return i.color;
- }
- ENDHLSL
- }
- }
- }
设置好之后,所有被选为Car层的物体都会被描边。(利用Render Objects也可以实现分层渲染、层级调整等等功能,自己去实验一下哦)
如果有一个摄像机渲染到渲染纹理,必须有另一个摄像机随后将该渲染纹理渲染到屏幕。在 URP 中,所有渲染到渲染纹理的摄像机将在所有渲染到屏幕的摄像机之前执行它们的渲染循环。这样可以确保渲染纹理已准备好渲染到屏幕。
下面讲述使用相机输入纹理做一个倒车镜功能。
如图所示,要做的事情就是让红车在倒车镜中可以看得到黄色的车,话不多说上步骤,首先我们将主相机放到可以观察到红车后视镜的位置(汽车模型是商店找的单面材质,凑合看)
其次新建一个相机,放到合适位置(可以观察到后车)
还需要一个操作,将Camera1输出到纹理。(Project窗口右键Create->Render Texture命名为rearview)在相机Inspector引用纹理。
接下来要做的事情就是讲这张纹理渲染到屏幕上,如果模型是拆分的,可以直接修改倒车镜材质shader应用到倒车镜模型上。
这边使用另一种方法,通过Image引用纹理来渲染。
最后将建好的Image放到倒车镜的位置,到这里功能就实现了。
注意:主相机Culling Mask一定要勾选纹理所在的层级
代码中动态设置
- yUniversalAdditionalCameraData.cameraOutput = CameraOutput.Texture;
- myCamera.targetTexture = myRenderTexture;
如果多个基础摄像机或摄像机堆叠渲染到某个渲染目标的同一区域,则 Unity 会多次绘制重叠区域中的每个像素。Unity 最后绘制具有最高优先级的基础摄像机或摄像机堆叠,位于先前绘制的像素之上。
下面讲述实现左右分屏
首先新建两个相机(Camera),在相机的Inspector窗口,修改Output->Viewport Rect 来实现分屏。
相机一:
相机二:
接着在Game视图中查看:
就这么实现了。 当然也可以自己去调整x.y.w.h来实现多宫格分屏。
其次也可以在代码中动态设置分屏
- var cameraData = camera.GetUniversalAdditionalCameraData();
- cameraData.rect = new Rect(0.5f, 0f, 0.5f, 0f);
完结!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。