Unity Forward渲染路径

本文深入探讨Unity中的Forward渲染路径,包括ForwardBase和ForwardAdd的工作原理,Unity如何在不同渲染模式下处理光源,以及逐顶点和逐像素光源的管理方式。通过理解这些核心概念,开发者能更高效地优化游戏性能。

一、ForwardBase和ForwardAdd

它们是专门为在Forward渲染路径下渲染物体而设计的两种Pass,ForwardBase会先于ForwardAdd执行。

Unity的Camera的三种PathRendering:Vertex Lit、Forward和Deferred Lighting三种。

1、在Vertex Lit渲染模式下,Forward Base和Forward Add的LightMode都不被支持。

2、ForwardAdd Pass需要和ForwardBase一起使用。

3、在Forward和Deferred渲染路径下,Forward的Pass都能被正常渲染。

二、Forward渲染路径下的重要光源

Unity的Light有Render Mode属性,包含两种:Important和Not Important。注:光源带颜色。

要检测_WorldSpaceLightPos0在ForwardBase和ForwardAdd的Pass内的状况。在ForwardAdd Pass内的顶点函数内,color=_WorldSpaceLightPos0.x。并且使用Blend One Zero的混合模式,可以输出最后执行的ForwardAdd Pass的输出,如果未被执行,将会输出ForwardBase Pass的结果。

结论是:_WorldSpaceLightPos0只会含有Pixel(逐像素)光源。在ForwardBase Pass内,只有场景中存在Important的逐像素平行光时,才会含有有效的_WorldSpaceLightPos0和_LightColor0的组合。

三、重要光源在ForwardAdd内的执行

除了第一个逐像素平行光之外(在ForwardBase Pass执行),其他每个Pixel(逐像素)光源都会在一个单独的ForwardAdd Pass内被执行,即场景中的Pixed光源数为n,则ForwardAdd Pass会被执行n-1次。对于将会被传到ForwardAdd内的每一个Pixel光源,Unity也是按照强弱的顺序依次让它们在ForwardAdd Pass内执行的。

四、ForwardBase和Unity存放光源的第一种方式

1、Vertex(逐顶点)光源,以及其他会被处理成Shader的光源会在ForwardBase内被计算。unity_4LightPos[X,Y,Z]0组合中包含4个Vertex点光源的数据,对应的unityL_LightColorl[0,1,2,3,4]数组都有正确的对应数据(光源颜色)。

2、逐个将点光源改为平行光,对应的光源也会逐个被移除unity_LightPos[X,Y,Z]0。

只有ForwardBase时的总结:在Forward和Deferred模式下,ForwardBase Pass内的unity_LightPos[X,Y,Z]0和unity_LightColor[4]只含有点光源,逐像素光源的排名更靠前。

又含有ForwardAdd时存放光源数据第一种方式的总结: Unity会在ForwardBase Pase内的unity_4LightPos[X,Y,Z]0中只放置Vertex点光源,并且数据都是在世界坐标内,不是相机空间内。

五、ForwardAdd和Unity存放光源的第一种方式

在ForwardAdd Pass内,unity_4LightPos[X,Y,Z]0组合和对应颜色数据只包含Vertex点光源,不含有任何Pixel光源或者平行光。这其实是为ForwardBase Pass内的unity_4LightPos[X,Y,Z]所准备的数据未被清除而已。对于每一个Pixel光源来说,ForwardAdd的Pass都会执行一次,所以不要在ForwardAdd Pass内计算unity_4LightPos[X,Y,Z]0中的数据。

六、Forward渲染路径和Unity存放光源的第三种方式

 unity_LightPosition[4]中存储的确实是视空间中的光源估息,也就是当前Camera空间的光源的方向矢量或者位置。在ForwardBase和ForwardAdd内从不包含任何有效数据。

### Unity灯光与渲染技术实现教程 在Unity中,灯光和渲染是一个复杂而重要的主题。以下是关于Unity灯光渲染的技术实现及其相关内容的详细介绍。 #### 1. 渲染路径的选择 Unity提供了多种渲染路径选项,每种都有其特定的应用场景和性能特点[^2]: - **前向渲染 (Forward)** 这是最常用的渲染模式,适用于大多数项目。在这种模式下,每个光源都会单独影响对象,并通过多次绘制完成最终效果。然而,随着场景中光源数量增加,性能会显著下降[^3]。 - **延迟渲染 (Deferred)** 延迟渲染提供更高质量的效果,适合高性能硬件设备。这种模式不会受到光源数量的影响,但在某些情况下可能会遇到兼容性问题,比如无法正确处理半透明物体。 - **传统顶点光照 (Legacy Vertex Lit)** 对于低端设备来说是个不错的选择,因为它牺牲了一些视觉质量以换取更好的运行效率。该方法仅计算模型顶点处接收到的光线强度并将其插值至整个表面。 #### 2. 不同类型的光源处理 根据所选渲染路径不同,各种类型光源的表现也会有所差异。例如,在前向渲染过程中,像素级光源能够带来更加精细的结果;而在延迟渲染里,则可以高效管理大量动态光源而不损失太多帧率。 #### 3. 使用Shader进行自定义渲染 为了达到理想的艺术风格或者优化现有流程,开发者常常需要编写自己的Shaders。当迁移到Universal Render Pipeline (URP)时,原有的标准材质可能不再适用,这时就需要调整相应的Shader代码来适配新的图形API需求[^4]。 下面展示了一个简单的URP Shader模板用于单张纹理映射的情况: ```csharp Shader "Custom/URPSingleTexture" { Properties { _MainTex ("Albedo", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" "Queue"="Geometry"} Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; }; struct Varyings { float2 uv : TEXCOORD0; float4 positionHCS : SV_POSITION; }; Varyings vert(Attributes input){ Varyings output; output.positionHCS = TransformObjectToHClip(input.positionOS.xyz); output.uv = input.uv; return output; } half4 frag(Varyings input):SV_Target{ half4 color = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,input.uv); return color; } ENDHLSL } } } ``` #### 4. 调试与优化技巧 如果发现渲染结果不符合预期,可能是由于以下几个原因造成的:环境设置错误、使用的Light组件配置不当或者是定制化的Shader逻辑存在问题等。此时应该逐一排查上述几个方面直至找到根本症结所在。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值