SRP Batcher 要求我们把每个材质特定的属性写到名为UnityPerMaterial这个cbuffer里,以此在 Unity 底层的渲染 Loop 里对使用了同一个 Shader 变体的物体进行合批渲染,其实就是把这些物体放在一块渲染,尽量不切或者少切 PSO。 可以看到 Unity Shader 里声明cbuffer的方式是这样的 CBUFFER_START(cbuffer_name) float4 ...
CBUFFER_START(UnityPerDraw) float4x4 unity_ObjectToWorld; float4x4 unity_WorldToObject; float4 unity_LODFade; real4 unity_WorldTransformParams; CBUFFER_END 要使我们的shader能够兼容,下一步是开启SRP批处理,通过设置GraphicsSettings.useScriptableRenderPipelineBatching为true来实现。我们只需要这样做一次,所以...
在UnityShaderVariables.cginc文件中,我们可以找到Unity提供的和处理光照有关的变量: CBUFFER_START(UnityLighting) #ifdef USING_DIRECTIONAL_LIGHT uniform fixed4 _WorldSpaceLightPos0; #else uniform float4 _WorldSpaceLightPos0; #endif uniform float4 _LightPositionRange; // xyz = pos, w = 1/range //...
在UnityShaderVariables.cginc文件中,我们可以找到Unity提供的和处理光照有关的变量: CBUFFER_START(UnityLighting) #ifdef USING_DIRECTIONAL_LIGHT uniform fixed4 _WorldSpaceLightPos0; #else uniform float4 _WorldSpaceLightPos0; #endif uniform float4 _LightPositionRange; // xyz = pos, w = 1/range //...
在RenderLoop.Prepare阶段,所有被梳理出来包含了单个ShaderPass全部数据的对象叫做ScriptableLoopObjectData,后文简称“ObjectData”。紧接着Unity会基于ObjectData的属性和当前DrawRendererCommand的具体过滤需求进行二次过滤,简介筛选条件如下: LayerMask RenderingLayerMask -> 对应不同(Universal)Renderer(和RendererAsset设置)...
CBUFFER_START(MyRarelyUpdatedVariables) float4 _SomeGlobalValue; CBUFFER_END 纹理/采样器声明宏 通常,在着色器代码中使用 texture2D 来声明纹理和采样器对。 但是在某些平台(例如 DX11)上,纹理和采样器是单独的对象, 并且可能的采样器最大数量非常有限。Unity 有一些宏来声明 没有采样器的纹理,并使用另一...
CBUFFER_START(MyRarelyUpdatedVariables) float4 _SomeGlobalValue; CBUFFER_END 表面着色器通道标志 编译表面着色器时,着色器以产生用于不同通道照明的大量代码结束。编译每个通道时,定义下列宏之一: UNITY_PASS_FORWARDBASE- 正向渲染基础通道(主方向灯、光照贴图、SH)。
那么对于步骤5可以使用unity 内部提供的两个方法Linear01Depth、LinearEyeDepth 传入屏幕纹理坐标和_ZBufferParams 来获取观察空间的场景深度和0-1线性深度,函数内部的原理即为上述步骤5。这也是shaderGraph 中SceneDepth 节点的做法。_ZBufferParams 是Unity 提供的内置变量,里面包含了远近裁剪平面相关的预计算。 同理,...
UNITY_INSTANCING_CBUFFER_START(Props) // put more per-instance properties here UNITY_INSTANCING_CBUFFER_END void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; ...
CBUFFER_START(MyRarelyUpdatedVariables) float4 _SomeGlobalValue; CBUFFER_END 纹理/采样器声明宏 通常,在着色器代码中使用texture2D来声明纹理和采样器对。 但是在某些平台(例如 DX11)上,纹理和采样器是单独的游戏对象, 并且可能的采样器最大数量非常有限。Unity 有一些宏来声明 没有采样器的纹理,并使用另一个...