当前位置: 首页 > news >正文

奉化网站关键词优化费用雄安企业网站建设

奉化网站关键词优化费用,雄安企业网站建设,石碣做网站优化,那种网站20211 3D 项目迁移到 URP 项目后出现的问题 3D 项目迁移至 URP 项目后#xff0c;会出现很多渲染问题#xff0c;如#xff1a;材质显示异常、GL 渲染不显示、多 Pass 渲染异常、屏幕后处理异常等问题。下面将针对这些问题给出一些简单的解决方案。 URP 官方教程和 API 详见→Un…1 3D 项目迁移到 URP 项目后出现的问题 3D 项目迁移至 URP 项目后会出现很多渲染问题如材质显示异常、GL 渲染不显示、多 Pass 渲染异常、屏幕后处理异常等问题。下面将针对这些问题给出一些简单的解决方案。 URP 官方教程和 API 详见→Universal RP 文档、Universal RP APIURP 项目环境搭建详见→Shader Graph简介。 本文完整资源见→Renderer Feature实验。 1内置材质渲染异常 在 Assets 窗口选中异常的内置材质依次单击【Edit→Rendering→Materials→Convert Selected Built-in Materials to URP】异常材质就会自动转换为 URP 内置材质转换后的材质对应的 shader 为 Universal Render Pipeline/Lit。 2GL 不渲染 3D 项目中在 MonoBehaviour的生命周期 的 OnPostRender 方法中执行 GL 命令详见→使用GL绘制线段。但是URP 项目中 OnPostRender 方法不会回调我们可以将 GL 命令移至 OnRenderObject 方法中以实现 GL 渲染。 3多 Pass 渲染异常 URP 项目中我们可以修改 Tag 里的 LightMode 属性以实现多 Pass 渲染如下。但是该方案最多只允许渲染 3 个 Pass 通道。 Tags{ LightMode SRPDefaultUnlit } Tags{ LightMode UniversalForward } Tags{ LightMode LightweightForward } 4屏幕后处理异常 3D 项目中我们在 MonoBehaviour的生命周期 的 OnRenderImage 方法中实现屏幕后处理详见→调整屏幕亮度、饱和度、对比度。但是在 URP 项目中OnRenderImage 方法不会回调。所幸Unity 为我们提供了 Rnederer Feature详见第 3 节为屏幕后处理提供了一个解决方案。另外通过 Global Volume 也可以实现屏幕后处理特效。 2 Renderer Objects 2.1 Render Objects 简介 RenderObjects 是 ScriptableRendererFeature 的一种实现它通过 RenderObjectsPass 渲染指定图层的对象。在 Assets 窗口选中 Universal Renderer Data 文件在 Inspector 窗口依次点击【Add Renderer Feature→Render Objects】如下。 添加 Render Objects 后显示如下。 NameRender Objects 标识建议修改Frame Debugger 窗口中可以看到该标识符Event渲染的时序点该渲染事件在什么时序上执行详见 RenderPassEventQueue渲染队列Layer Mask渲染指定图层的游戏对象LightMode Tags渲染路径取值有SRPDefaultUnlit、UniversalForward、LightweightForwardMaterial待渲染的材质拖入材质后需要设置 Pass IndexPass 通道索引Depth深度测试配置开启后可以配置 Write Depth 写入深度缓存和 Depth Test深度测试取值有 Less、Equal 等Stencil模板测试配置开启后可以配置 Value模板参考值、Compare Function比较函数取值有 Less、Equal 等、Pass模板测试和深度测试均通过时的策略取值有 Keep、Replace 等、Fail模板测试未通过时的策略取值有 Keep、Replace 等、ZFail模板测试通过但深度测试未通过时的策略取值有 Keep、Replace 等Camera相机配置开启后可以配置 Field of View视角、Position Offset偏移。 public enum RenderPassEvent {BeforeRendering 0, // 渲染前BeforeRenderingShadows 50, // 渲染阴影前AfterRenderingShadows 100, // 渲染阴影后BeforeRenderingPrePasses 150, // 渲染PrePasses前[EditorBrowsable(EditorBrowsableState.Never)][Obsolete(Obsolete, to match the capital from Prepass to PrePass (UnityUpgradable) - BeforeRenderingPrePasses)]BeforeRenderingPrepasses 151, // 渲染PrePasses前AfterRenderingPrePasses 200, // 渲染PrePasses后BeforeRenderingGbuffer 210, // 渲染Gbuffer前AfterRenderingGbuffer 220, // 渲染Gbuffer后BeforeRenderingDeferredLights 230, // 渲染延时光照前AfterRenderingDeferredLights 240, // 渲染延时光照后BeforeRenderingOpaques 250, // 渲染不透明物体前AfterRenderingOpaques 300, // 渲染不透明物体后BeforeRenderingSkybox 350, // 渲染天空盒子前AfterRenderingSkybox 400, // 渲染天空盒子后BeforeRenderingTransparents 450, // 渲染透明物体前AfterRenderingTransparents 500, // 渲染透明物体后BeforeRenderingPostProcessing 550, // 屏幕后处理前AfterRenderingPostProcessing 600, // 屏幕后处理后AfterRendering 1000 // 渲染前 } 2.2 Render Objects 应用 本节将通过一个简单的描边特效介绍 Render Objects 的应用更复杂的描边详见→选中物体描边特效、基于模板测试和顶点膨胀的描边方法、边缘检测特效、基于深度和法线纹理的边缘检测方法。 1创建 Shader Outline.shader Shader MyShader/Outline {Properties {_OutlineColor(_OutlineColor, Color) (1, 0, 0, 1) // 描边颜色_OutlineWidth(Outline Width, Range(0.01, 1)) 0.1 // 描边宽度}SubShader {Pass {Cull Front // 关闭剔除渲染, 取值有: Off、Front、Back, Off表示正面和背面都渲染CGPROGRAM#include UnityCG.cginc#pragma vertex vert#pragma fragment fragfixed4 _OutlineColor; // 描边颜色float _OutlineWidth; // 描边宽度struct a2v {float4 vertex : POSITION; // 模型空间顶点坐标float3 normal : NORMAL; // 模型空间法线向量};struct v2f {float4 pos : SV_POSITION; // 裁剪空间顶点坐标};v2f vert(a2v v) {v2f o;float3 viewNormal normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal)); // 观察空间法线向量float3 viewPos UnityObjectToViewPos(v.vertex); // 观察空间顶点坐标o.pos UnityViewToClipPos(viewPos viewNormal * _OutlineWidth * (-viewPos.z) * 0.1); // 裁剪空间顶点坐标return o;}fixed4 frag(v2f i) : SV_Target {return _OutlineColor;}ENDCG}} } 说明创建材质并重命名为 OutlineMat将 Outline.shader 拖拽到 OutlineMat 中。 2创建 Render Objects 在 Assets 窗口选中 Universal Renderer Data 文件在 Inspector 窗口点击 Add Renderer Feature 添加 Render Objects配置 Render Objects 如下。 3运行效果 给需要描边的物体设置图层为 Outline效果如下。 3 自定义 Renderer Feature 要使用 Renderer Feature我们需要编写两个类继承自 ScriptableRendererFeature 的 Feature 类和继承自 ScriptableRenderPass 的 Pass 类。  3.1 Renderer Feature 简介 1创建 Renderer Feature 在 Assets 窗口右键弹出菜单栏依次选择【Create→Rendering→URP Renderer Feature】生成 CustomRenderPassFeature.cs 文件。  2CustomRenderPassFeature 打开 CustomRenderPassFeature.cs 文件如下其中 Debug 日志是笔者添加的为方便后文查看 Feature 生命周期。 using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal;public class CustomRenderPassFeature : ScriptableRendererFeature { // 自定义的Featureclass CustomRenderPass : ScriptableRenderPass { // 自定义的Passpublic override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { // 渲染Pass前回调, 此处可以申请内存Debug.Log(CustomRenderPass-OnCameraSetup);}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { // 渲染执行逻辑Debug.Log(CustomRenderPass-Execute);}public override void OnCameraCleanup(CommandBuffer cmd) { // 渲染Pass后回调, 此处可以清除内存操作Debug.Log(CustomRenderPass-OnCameraCleanup);}}CustomRenderPass m_ScriptablePass; // 自定义的Passpublic override void Create() { // 创建自定义的PassDebug.Log(CustomRenderPassFeature-Create);m_ScriptablePass new CustomRenderPass();m_ScriptablePass.renderPassEvent RenderPassEvent.AfterRenderingOpaques; // 渲染事件注入的时机}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { // 将Pass添加到渲染队列中Debug.Log(CustomRenderPassFeature-AddRenderPasses);renderer.EnqueuePass(m_ScriptablePass);} } 3添加自定义 Renderer Feature 在 Assets 窗口选中 Universal Renderer Data 文件在 Inspector 窗口依次点击【Add Renderer Feature→Custom Render Pass Feature】如下。 添加 Custom Render Pass Feature 后显示如下Name 建议修改在 Frame Debugger 中可以看到该 Name方便调试。 4Renderer Feature 生命周期 运行程序后打印日志如下。 由日志可以得出以下结论 Render Feature 的执行时序是Create→AddRenderPasses→OnCameraSetup→Execute→OnCameraCleanupCreate 方法只在程序启动时执行几次后面就不执行了AddRenderPasses、OnCameraSetup、Execute、OnCameraCleanup 方法每帧都会执行一次。 3.2 Renderer Feature 应用 本节通过一个 调整屏幕亮度、饱和度、对比度 的案例介绍 Render Feature 在屏幕后处理中的应用。 1创建自定义 Feature FullscreenFeature.cs using UnityEngine.Rendering.Universal; using UnityEngine;public class FullscreenFeature : ScriptableRendererFeature {public Settings settings new Settings(); // 设置FullscreenPass blitPass; // 后处理的Passpublic override void Create() { // 创建后处理Pass(自动回调)blitPass new FullscreenPass(name);}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { // 添加渲染Pass(自动回调)if (settings.blitMaterial null) {return;}blitPass.renderPassEvent settings.renderPassEvent;blitPass.settings settings;renderer.EnqueuePass(blitPass);}[System.Serializable]public class Settings { // 配置项public RenderPassEvent renderPassEvent RenderPassEvent.AfterRenderingOpaques;public Material blitMaterial null;} } 说明FullscreenFeature 不是单例, 可以在 Universal Renderer Data 中配置多实例可能有多个屏幕后处理特效。 2创建自定义 Pass FullscreenPass.cs using UnityEngine.Rendering.Universal; using UnityEngine.Rendering; using UnityEngine;internal class FullscreenPass : ScriptableRenderPass {public FullscreenFeature.Settings settings; // 配置项private string profilerTag; // 分析器标签, 在Frame Debugger中可以看到该标签private RenderTargetIdentifier source; // 源缓存标识private RenderTargetIdentifier destination; // 目标缓存标识private int destinationId; // 目标缓存idprivate FilterMode filterMode; // 纹理采样滤波模式, 取值有: Point、Bilinear、Trilinearpublic FullscreenPass(string tag) {profilerTag tag;destinationId Shader.PropertyToID(_TempRT);}public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { // 渲染前回调RenderTextureDescriptor blitTargetDescriptor renderingData.cameraData.cameraTargetDescriptor;blitTargetDescriptor.depthBufferBits 0;ScriptableRenderer renderer renderingData.cameraData.renderer;source renderer.cameraColorTarget;cmd.GetTemporaryRT(destinationId, blitTargetDescriptor, filterMode);destination new RenderTargetIdentifier(destinationId);}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { // 执行渲染CommandBuffer cmd CommandBufferPool.Get(profilerTag);Blit(cmd, source, destination, settings.blitMaterial);Blit(cmd, destination, source);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}public override void FrameCleanup(CommandBuffer cmd) { // 渲染后回调if (destinationId ! -1) {cmd.ReleaseTemporaryRT(destinationId);}} } 3创建 Shader BrigSatuCont.shader Shader MyShader/BrightnessSaturationContrast { // 调整亮度、饱和度、对比度Properties{_MainTex(Base (RGB), 2D) white {} // 主纹理_Brightness(Brightness, Range(0.5, 3)) 1 // 亮度_Saturation(Saturation, Range(0.1, 5)) 1 // 饱和度_Contrast(Contrast, Range(0.4, 3)) 1 // 对比度}SubShader{Pass {// 深度测试始终通过, 关闭深度写入//ZTest Always ZWrite OffCGPROGRAM#pragma vertex vert_img // 使用内置的vert_img顶点着色器#pragma fragment frag #include UnityCG.cgincsampler2D _MainTex; // 主纹理half _Brightness; // 亮度half _Saturation; // 饱和度half _Contrast; // 对比度fixed4 frag(v2f_img i) : SV_Target { // v2f_img为内置结构体, 里面只包含pos和uvfixed4 tex tex2D(_MainTex, i.uv); // 纹理采样fixed3 finalColor tex.rgb * _Brightness; // 应用亮度_Brightnessfixed luminance 0.2125 * tex.r 0.7154 * tex.g 0.0721 * tex.b; // 计算亮度fixed3 luminanceColor fixed3(luminance, luminance, luminance); // 饱和度为0、亮度为luminance的颜色finalColor lerp(luminanceColor, finalColor, _Saturation); // 应用饱和度_Saturationfixed3 avgColor fixed3(0.5, 0.5, 0.5); // 饱和度为0、亮度为0.5的颜色finalColor lerp(avgColor, finalColor, _Contrast); // 应用对比度_Contrastreturn fixed4(finalColor, tex.a);}ENDCG}}Fallback Off } 说明创建材质并重命名为 BrigSatuContMat将 BrigSatuCont.shader 拖拽到 BrigSatuContMat 中。 4添加 Feature 在 Assets 窗口选中 Universal Renderer Data 文件在 Inspector 窗口依次点击【Add Renderer Feature→Fullscreen Feature】如下。 将 BrigSatuContMat 材质拖拽到 Renderer Feature 中并修改 Name 属性为 BrigSatuCont如下。 5运行效果 通过修改 BrigSatuContMat 中 Brightness、Saturation、Contrast 属性运行效果如下。左侧是原图右侧是调整亮度、饱和度、对比度后的渲染效果。 6动态获取 Feature 用户如果想在 MonoBehaviour 中获取 Renderer Feature可以通过以下代码片段获取。 private FullscreenFeature GetFeature(string name) { // 获取featureUniversalRendererData rendererData Resources.LoadUniversalRendererData(Full Universal Renderer Data);if (rendererData ! null !string.IsNullOrEmpty(name)) {ListFullscreenFeature features rendererData.rendererFeatures.OfTypeFullscreenFeature().ToList();foreach (FullscreenFeature feature in features) {if (name.Equals(feature.name)) {return feature;}}}return null; } 也可以通过以下工具类获取 Renderer Feature。 URPFeatureUtils.cs using UnityEngine.Rendering.Universal; using UnityEngine.Rendering; using System.Reflection;public class URPFeatureUtils {private static URPFeatureUtils instance; // 单例private UniversalRendererData rendererData; // 渲染数据, 存储了feature列表private URPFeatureUtils() {rendererData GetRendererData();}public static T GetFeatureT(string name) where T : ScriptableRendererFeature { // 获取featureif (instance null) {instance new URPFeatureUtils();}if (instance.rendererData ! null) {return GetFeatureT(instance.rendererData, name);}return null;}private static T GetFeatureT(UniversalRendererData rendererData, string name) where T : ScriptableRendererFeature { // 获取featureif (rendererData ! null !string.IsNullOrEmpty(name)) {foreach (ScriptableRendererFeature feature in rendererData.rendererFeatures) {if (feature is T name.Equals(feature.name)) {return (feature as T);}}}return null;}private UniversalRendererData GetRendererData() { // 通过反射获取渲染数据, 也可以通过Resources.Load加载, 但是需要将UniversalRendererData文件放在Resources目录下UniversalRenderPipelineAsset urpAsset GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;FieldInfo propertyInfo urpAsset.GetType().GetField(m_RendererDataList, BindingFlags.Instance | BindingFlags.NonPublic);ScriptableRendererData[] rendererDatas (ScriptableRendererData[])propertyInfo.GetValue(urpAsset);if (rendererDatas ! null rendererDatas.Length 0 (rendererDatas[0] is UniversalRendererData)) {return rendererDatas[0] as UniversalRendererData;}return null;} } 说明之所以要使用反射因为 UniversalRenderPipelineAsset 中的 m_RendererDataList 属性不是 public 的并且没有给外界提供获取 m_RendererDataList 的接口。
http://www.eeditor.cn/news/121458/

相关文章:

  • 使用jsp开发的网站新网站上线 怎么做seo
  • 网站空间租wordpress清楚所有评论
  • 网站开发tornado宿迁房产查询网上查询系统
  • 物流建设网站总结报告上海近期大事件
  • 章丘网站开发培训淘宝客网站html
  • 网站建设后台有哪些项目建立网站需要什么硬件
  • 德阳建设网站的公司安汇达大宗商品交易平台
  • 织梦怎么在本地编辑多个网站保定免费做网站
  • 廊坊建站软件用vs做网站后台开发可以吗
  • 织梦系统网站地图模板下载东莞网站优化指导
  • 哪家企业做网站可以兼职做翻译的网站或app
  • 聊城做网站优化wordpress 复杂表单
  • 网站开发视频播放网站WordPress简洁主题单栏
  • 网站建设mng邢台网公众号
  • 九江本土专业网站建设北京网站建设类岗位
  • 如何做网站模特wordpress 文章版本
  • 建设网站费用如何入账谷歌网站地图提交
  • 建设银行网站介绍seo外链是什么
  • 网站建设市场多大深圳网络营销公司有哪些
  • 国外高清人像图片素材网站如何知道网站什么时候做的
  • 网站维护常见问题中企动力服务怎么样
  • 股票海选公司用什么网站写作网站有哪些
  • 首页网站关键词优化教程最新事故案例100例
  • 网站建设客户会问的问题网络公司经营范围包括劳务吗
  • 化妆品网站开发的外文翻译网站建设亇金手指排名十四
  • 小程序做跳转微网站郑州 手机网站制作
  • 企业建站系统下载项目计划书怎么写
  • 山东网站排名优化公司搭建人才培养平台
  • 网站开发具体工作内容做化工的在哪个网站做平台好
  • 高邮城乡建设局 网站福建建筑人才网官方网站