IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3d URP 渲染管线和 Built in 渲染管线中 shader 的区别 -> 正文阅读

[游戏开发]Unity3d URP 渲染管线和 Built in 渲染管线中 shader 的区别

  1. URP使用HLSL语言;BIPR使用CG语言

  2. URP 的SubShader的Tags中需要添加"RenderPipeline" = “UniversalPipeline”

  3. URP使用单一的forward通道,多个光照通过数组形式传入;BIPR每一个光照跑一个pass

  4. 合批流程不同,URP给每个不同的材质球建立持久化数据在gpu中,每一个shader变体一次合批,无论多少材质球;URP每一个材质球一次合批(下图)CBUFFER_START, CBUFFER_END
    在这里插入图片描述

  5. URP需要定义取样器SAMPLER(sampler_BaseMap),和取样贴图TEXTURE2D(_BaseMap);

  6. 灯光模式(LightMode)不同

内置管线URP
ForwardBaseUniversalForward
ForwardAdd移除
Deferred以及相关尚未支持
Vertex及相关移除
ShadowCasterShadowCaster
MotionVectors尚未支持
DepthOnly
Meta (for lightmap baking)
Universal2D
  1. URP变体 ,需要使用#pragma multi_compile添加一些关键字:
    * _MAIN_LIGHT_SHADOWS
    * _MAIN_LIGHT_SHADOWS_CASCADE
    * _ADDITIONAL_LIGHTS_VERTEX
    * _ADDITIONAL_LIGHTS
    * _ADDITIONAL_LIGHT_SHADOWS
    * _SHADOWS_SOFT
    * _MIXED_LIGHTING_SUBTRACTIVE

  2. 后处理/视觉特效
    URP不支持OnPreCull,OnPreRender,OnPostRender和OnRenderImage这些方法。URP支持OnRenderObject和OnWillRenderObject,但是如果在URP中使用你可能会发现问题。因此,如果你曾经在旧管线创建视觉效果时使用它们,那么现在你需要学习新方法了。URP包含以下注入点:

     * beginCameraRendering(ScriptableRenderContext context, Camera camera)
     * endCameraRendering(ScriptableRenderContext context, Camera camera)
     * beginFrameRendering(ScriptableRenderContext context,Camera[] cameras)
     * endFrameRendering(ScriptableRenderContext context,Camera[] cameras)
    

    注:如果需要在begin/endCameraRendering中渲染,需要使用RenderSingleCamera()代替 Camera.Render()。另外也可以使用ScriptableRendererFeature来实现。详见:链接

  3. 不再使用GrabTexture,而是使用_CameraOpaqueTexture或_CameraColorTexture。
    GrabPass{ }改成 SAMPLER(_CameraOpaqueTexture),且需要开启URP管线设置的Opaque Texture。

  4. 预定义着色器宏
    可能需要include 的库:
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”

内置管线URP
UNITY_PROJ_COORD(a)移除了,使用a.xy / a.w代替
UNITY_INITIALIZE_OUTPUT(type,name)ZERO_INITIALIZE(type,name)
UNITY_DECLARE_SHADOWMAP(tex)TEXTURE2D_SHADOW_PARAM(textureName,samplerName)
UNITY_SAMPLE_SHADOW(tex,uv)SAMPLE_TEXTURE2D_SHADOW(textureName,samplerName,coord3)
UNITY_SAMPLE_SHADOW_PROJ(tex,uv)SAMPLE_TEXTURE2D_SHADOW(textureName,samplerName,coord4.xyz/coord4.w)
UNITY_DECLARE_TEX2D(name)TEXTURE2D(textureName); SAMPLER(samplerName)
UNITY_DECLARE_TEX2D_NOSAMPLER(name)TEXTURE2D(textureName)
UNITY_DECLARE_TEX2DARRAY(name)TEXTURE2D_ARRAY(textureName); SAMPLER(samplerName)
UNITY_SAMPLE_TEX2D(name,uv)SAMPLE_TEXTURE2D(textureName,samplerName,coord2)
UNITY_SAMPLE_TEX2D_SAMPLER(name,samplername,uv)SAMPLE_TEXTURE2D(textureName,samplerName,coord2)
UNITY_SAMPLE_TEX2DARRAY(name,uv)SAMPLE_TEXTURE2D_ARRAY(textureName,samplerName,coord2,index)
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod)SAMPLE_TEXTURE2D_ARRAY_LOD(textureName,samplerName,coord2,index,lod)

函数:

内置管线URP
float4 UnityObjectToClipPos(float3 pos)float4 TransformObjectToHClip(float3 positionOS)
float3 UnityObjectToViewPos(float3 pos)TransformWorldToView(TransformObjectToWorld(positionOS))
float3 WorldSpaceViewDir(float4 v)float3 GetWorldSpaceViewDir(float3 positionWS)
float3 ObjSpaceViewDir(float4 v)移除了,可以使用TransformWorldToObject(GetCameraPositionWS()) - objectSpacePosition
float2 ParallaxOffset(half h,half height,half3 viewDir)移除了。可以从UnityCG.cginc复制过来
fixed Luminance(fixed3 c)real Luminance(real3 linearRgb)
fixed3 DecodeLightmap(fixed4 color)real3 DecodeLightmap(real4 encodedIlluminance, real4 decodeInstructions)
float4 EncodeFloatRGBA(float v)移除了。可以从UnityCG.cginc复制过来
float DecodeFloatRGBA(float4 enc)移除了。可以从UnityCG.cginc复制过来
float2 EncodeFloatRG(float v)移除了。可以从UnityCG.cginc复制过来
float DecodeFloatRG(float2 enc)移除了。可以从UnityCG.cginc复制过来
float2 EncodeViewNormalStereo(float3 n)移除了。可以从UnityCG.cginc复制过来
float3 DecodeViewNormalStereo(float4 enc4)移除了。可以从UnityCG.cginc复制过来
float3 WorldSpaceLightDir(float4 v)_MainLightPosition.xyz - TransformObjectToWorld(objectSpacePosition)
float3 ObjSpaceLightDir(float4 v)TransformWorldToObject(_MainLightPosition.xyz)-objectSpacePosition
float3 Shade4PointLights(…)可以使用half3 VertexLighting(float3 positionWS, half3 normalWS)
float4 ComputeScreenPos(float4 clipPos)float4 ComputeScreenPos(float4 positionCS)
float4 ComputeGrabScreenPos(float4 clipPos)移除了
float3 ShadeVertexLights (float4 vertex, float3 normal)移除了,可以尝试使用UNITY_LIGHTMODEL_AMBIENT.xyz + VertexLighting(…)

变量:

内置管线URP
_LightColor0_MainLightColor
_WorldSpaceLightPos0_MainLightPosition
_LightMatrix0移除了。目前尚不支持Cookie
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取额外光源信息
unity_4LightAtten0在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取额外光源信息
unity_LightColor在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取额外光源信息
unity_WorldToShadowfloat4x4 _MainLightWorldToShadow[MAX_SHADOW_CASCADES + 1] 或者_AdditionalLightsWorldToShadow[MAX_VISIBLE_LIGHTS]

其他:

内置管线URP
UNITY_SHADOW_COORDS(x)移除了。DIY,例如float4 shadowCoord : TEXCOORD0;
TRANSFER_SHADOW(a)a.shadowCoord = TransformWorldToShadowCoord(worldSpacePosition)
SHADOWS_SCREEN移除了。不支持。
UNITY_FOG_COORDS(x)移除了。DIY,例如float fogCoord : TEXCOORD0
UNITY_TRANSFER_FOG(o*,outpos)o.fogCoord = ComputeFogFactor(clipSpacePosition.z)
UNITY_APPLY_FOG(coord,col)color = MixFog(color,i.fogCoord)
LinearEyeDepth(sceneZ)LinearEyeDepth(sceneZ,_ZBufferParams)
Linear01Depth(sceneZ)Linear01Depth(sceneZ,_ZBufferParams)
ShadeSH9(normal)SampleSH(normal)
unity_ColorSpaceLuminance移除了。使用Luminance()

以上内容部分转载自:https://www.jianshu.com/p/3fef69e2efb6

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-21 12:43:55  更:2021-10-21 12:44:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:47:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码