首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单位URP Blit渲染特征不呈现单道实例VR

单位URP Blit渲染特征不呈现单道实例VR
EN

Stack Overflow用户
提问于 2021-11-27 13:50:05
回答 1查看 980关注 0票数 1

我的blit渲染功能在虚拟现实和多通道渲染的PC上工作。但单道渲染阴影时,左眼是灰色的,右眼是黑色的。

这是我在渲染功能中使用的着色器。为了保持着色器的简单性,我从下面删除了一些代码,只显示了相关区域:

代码语言:javascript
复制
   struct Attributes
   {
     float4 vertex : POSITION;
     float2 uv : TEXCOORD0;

     UNITY_VERTEX_INPUT_INSTANCE_ID
   };

   struct Varyings
   {
     float2 uv : TEXCOORD0;
     float4 vertex : SV_POSITION;

     UNITY_VERTEX_INPUT_INSTANCE_ID
     UNITY_VERTEX_OUTPUT_STEREO
   };

   Varyings vert(Attributes i)
   {
     UNITY_SETUP_INSTANCE_ID(i);
     
     Varyings o = (Varyings)0;
     UNITY_TRANSFER_INSTANCE_ID(i, o);
     UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
     o.vertex = TransformObjectToHClip(i.vertex.xyz);
     o.uv = UnityStereoTransformScreenSpaceTex(i.uv);
     
     return o;
   }

   half4 frag(Varyings i) : SV_Target0
   {
     UNITY_SETUP_INSTANCE_ID(i);
     UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);

     if (SLICE_ARRAY_INDEX == 0)
     {
       return half4(1,0,0,1);
     }
     else
     {
       return half4(0,0,1,1);
     }

   }

以下是呈现特性代码:

代码语言:javascript
复制
     public class RaymarchRenderFeature : ScriptableRendererFeature
 {
   [SerializeField] private RenderPassEvent passEvent = RenderPassEvent.AfterRenderingSkybox;
 
   private RaymarchRenderPass _renderPass;
 
   public override void Create()
   {
     _renderPass = new RaymarchRenderPass(name)
     {
       renderPassEvent = passEvent
     };
   }
 
   public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
   {
     renderer.EnqueuePass(_renderPass);
   }
 }
 
 public class RaymarchRenderPass : ScriptableRenderPass
 {
   private readonly string _profilerTag;
 
   private RenderTargetIdentifier _destination;
 
   public RaymarchRenderPass(string profilerTag)
   {
     _profilerTag = profilerTag;
   }
 
   public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
   {
     RenderTextureDescriptor descriptor = cameraTextureDescriptor;
     // descriptor.enableRandomWrite = true;
     
     cmd.GetTemporaryRT(Shader.PropertyToID("_Destination"), descriptor);
     _destination = new RenderTargetIdentifier("_Destination");
   }
 
   public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
   {
     var camera = renderingData.cameraData.camera;
     var cameraColourTexture = renderingData.cameraData.renderer.cameraColorTarget;
 
 #if UNITY_EDITOR
     if (camera.cameraType is not (CameraType.SceneView or CameraType.Game))
     {
       return;
     }
 #endif
 
     if (!Raymarch.ShouldRender())
     {
       return;
     }
 
     CommandBuffer cmd = CommandBufferPool.Get(_profilerTag);
 
     Raymarch.Material.SetMatrix(Shader.PropertyToID("_CamToWorldMatrix"), camera.cameraToWorldMatrix);
     Raymarch.UploadShaderDataInvoke();
 
     cmd.Blit(cameraColourTexture, _destination, Raymarch.Material);
     cmd.Blit(_destination, cameraColourTexture);
 
     context.ExecuteCommandBuffer(cmd);
     // cmd.Clear();
     CommandBufferPool.Release(cmd);
 
     context.Submit();
   }
 
   public override void OnCameraCleanup(CommandBuffer cmd)
   {
     cmd.ReleaseTemporaryRT(Shader.PropertyToID("_Destination"));
   }
 }

任何帮助都将不胜感激!如果您想查看GitHub:团结-行军上可用的其余代码

EN

回答 1

Stack Overflow用户

发布于 2022-03-22 10:37:41

原来这是一个已知的问题,请查看问题跟踪器页面这里

它是固定在撰写时,但还没有发布到社区,希望,这将在不久的将来发生。目前有一个解决办法,使用DrawMesh而不是Blit调用。查看这个回购程序,了解如何实现它:

示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70135377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档