Unity RenderPath与Drawcall

本文深入探讨了Unity中三种渲染路径(ForwardPath、DeferredPath及VertexLitPath)如何影响Drawcall的数量,特别关注它们在不同光照条件和场景复杂度下的表现。通过分析,揭示了每种路径的独特优势和适用场景,旨在帮助开发者更高效地优化渲染性能。

考察render path与drawcall的关系,每个camera可以单独设置render path。以计算光照,不考虑batching,且只有一个PASS的材质为样本,比如Diffuse;如果材质不受光照影响,则跳过光照相关的PASS,比如Unlit/Texture。

1.Forward Path.

最亮的directional light(自动成为pixel light)与其他的非pixel light一起被forward base PASS一次性绘制。其余的important light(强制PIXEL LIGHT),每个都会产生一次forward add PASS的drawcall,且是该光源影响的物体个数每个产生一次drawcall;如果不足3个(可设置)important light则按亮度选出前3个执行forward add PASS。当PIXEL LIGHT与物体较多的场合,会产生迅猛的drawcall增长。假设所有IMPORTANT光源影响所有物体,那么多出的drawcall=光源数*物体数。自写的shader会依据是否使用光照和pass个数对drawcall产生影响。pixel light才能对normal map specular map等基于纹理图像的效果产生作用,光源多场景复杂的情况下,需要考虑deferred path。

2.Deferred Path.

Deferred Path在UNITY中没有实现透明物体渲染和全屏抗锯齿功能(MSAA),透明物体渲染会在非透明物体完成deferred的final pass后使用forward path来渲染。所有的光源全为pixel light(默认只提供blinn-phone),一个光源产生一个drawcall(2个,如果有lightmap),且与场景复杂度无关,即只要该光源影响到屏幕结果就会产生一个drawcall,drawcall=光源数(*2,如果有lightmap)+物体数*2+1。其中2为base pass的NORMAL+SPECULAR 和 depth,depth pass是否单独执行与显卡和设置的环境有关,每个光源执行light pass,最后一个全屏的final pass得到最终结果。

换句话说,forward把几何与光照放在一个PASS里执行了,而deferred对几何信息与光照分别执行,产生了解耦的作用。

3.Vertex Lit Path.

一个物体一个drawcall。

4.Shadow.

待续。

转载于:https://www.cnblogs.com/nihil/p/3926684.html

### 条纹贴图效果实现教程 在Unity的URP(Universal Render Pipeline)中实现条纹贴图效果,可以通过材质和着色器进行配置。条纹贴图通常用于模拟诸如布料、金属拉丝或水波等具有重复纹理的效果。以下是实现该效果的具体方法: #### 1. 创建自定义Shader 首先,创建一个新的Shader来支持条纹效果。可以使用Shader Graph工具或手动编写HLSL代码。 ##### 使用Shader Graph - 在Unity中右键点击项目资源文件夹,选择`Create > Shader > Universal Render Pipeline/Lit`。 - 打开创建的Shader Graph,在Master节点前添加一个`Texture2D`节点作为基础纹理。 - 添加一个`Tiling and Offset`节点以控制纹理的平铺和偏移。 - 使用`Vector1`节点生成条纹图案,并将其基础纹理混合。例如,可以通过正弦函数生成动态条纹: ```hlsl float stripe = abs(frac(worldPos.y * frequency + time) * 2 - 1); ``` 此处的`frequency`控制条纹密度,`time`用于动画效果[^1]。 ##### 手动编写Shader 如果需要更灵活的控制,可以手动编写Shader代码。以下是一个简单的示例: ```hlsl Shader "Custom/StripedTexture" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _StripeColor ("Stripe Color", Color) = (1,1,1,1) _Frequency ("Frequency", Float) = 10 _Speed ("Speed", Float) = 1 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _StripeColor; float _Frequency; float _Speed; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { float t = _Time.y * _Speed; // 动画时间 float stripe = abs(frac(i.uv.y * _Frequency + t) * 2 - 1); // 条纹计算 fixed4 col = tex2D(_MainTex, i.uv); // 基础纹理 col.rgb = lerp(col.rgb, _StripeColor.rgb, smoothstep(0.4, 0.6, stripe)); // 混合条纹颜色 return col; } ENDCG } } } ``` #### 2. 配置Material - 创建一个新的Material并将其Shader设置为刚刚创建的自定义Shader。 - 在Inspector面板中调整`_Frequency`和`_Speed`参数以获得所需的条纹效果。 #### 3. 应用到模型 将配置好的Material应用到目标模型上。可以通过调整UV映射来进一步优化条纹的方向和比例[^2]。 #### 4. 性能优化 在URP中,性能优化非常重要。对于条纹贴图效果,可以考虑以下几点: - **减少Draw Call**:合并具有相同材质的小物体。 - **LOD组**:为远距离的对象使用较低细节的模型或简化材质[^2]。 - **阴影优化**:避免不必要的阴影计算,特别是对于高频纹理对象[^3]。 ```python # 示例Python脚本(可选) import bpy def apply_striped_texture(object_name, material_path): obj = bpy.data.objects[object_name] mat = bpy.data.materials.load(material_path) if obj.data.materials: obj.data.materials[0] = mat else: obj.data.materials.append(mat) apply_striped_texture("Cube", "path/to/striped_material") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值