1

我的 blit 渲染功能适用于 VR 之外的 PC 和多通道渲染。但是在单通道实例化 VR 中渲染着色器时,左眼是灰色的,右眼是黑色的。

单通道实例化 VR

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

   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);
     }

   }

这是渲染功能代码:

     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 上提供的其余代码:Unity-Raymarching

4

0 回答 0