Создание нечетного двойного изображения с помощью Blit с Steam VR Camera (Unity) - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь визуализировать подводный шейдер поверх глаз камеры SteamVR. Эффект действительно работает и воспроизводится правильно, однако стереоскопическое изображение c удваивается на обоих глазах, тем самым устраняя любую глубину. Посмотрите на изображения, чтобы понять, что я имею в виду.

Камера без VR, использующая тот же сценарий и материал.

Использование камеры Steam VR. Обратите внимание, что есть 4 различных рендера камеры.

К вашему сведению, я использую Unity 2019.2.17f1 и SteamVR v2.5. Я также установил Single Pass для режима стерео рендеринга. Я не слишком хорошо разбираюсь в конвейере рендеринга виртуальной реальности, поэтому буду очень признателен за любую помощь.

Это скрипт для добавления материала в рендер камеры. Он прикреплен к игровому объекту с помощью компонента камеры:

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.XR;
using Valve.VR;

[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class CameraOverlay : MonoBehaviour
{
    public Material effectMaterial;

    void OnRenderImage(RenderTexture src, RenderTexture dst)
    {
        Graphics.Blit(src, dst, effectMaterial);
    }

    /*private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        RenderTextureDescriptor desc;
        if (XRSettings.enabled)
            desc = XRSettings.eyeTextureDesc;
        else
            desc = new RenderTextureDescriptor(Screen.width, Screen.height); // Not XR

        RenderTexture rt = RenderTexture.GetTemporary(desc);
        Graphics.Blit(source, rt, effectMaterial, 0);
        Graphics.Blit(rt, destination, effectMaterial, 1);
        RenderTexture.ReleaseTemporary(rt);
    }*/
}

Это скрипт для подводного шейдера:

Shader "Hidden/BlackOverlayShader"
{
   Properties
   {
       _MainTex("Texture", 2D) = "white" {}
       _DisplaceTex("Displacement Texture", 2D) = "white" {}
       _Magnitude("Magnitude", Range(0,0.1)) = 1
   }
   SubShader
   {
       // No culling or depth
       Cull Off ZWrite Off ZTest Always

       Pass
       {
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag

           #include "UnityCG.cginc"

           struct appdata
           {
               float4 vertex : POSITION;
               float2 uv : TEXCOORD0;
           };

           struct v2f
           {
               float2 uv : TEXCOORD0;
               float4 vertex : SV_POSITION;
           };

           v2f vert(appdata v)
           {
               v2f o;
               o.vertex = UnityObjectToClipPos(v.vertex);
               o.uv = v.uv;
               return o;
           }

           sampler2D _MainTex;
           half4 _MainTex_ST;
           sampler2D _DisplaceTex;
           float _Magnitude;

           float4 frag(v2f i) : SV_Target
           {
               float2 disp = tex2D(_DisplaceTex, i.uv).xy;
               disp = ((disp * 2) - 1) * _Magnitude;

               float4 col = tex2D(_MainTex, i.uv + disp);
               return col;
           }
           ENDCG
       }
   }
}
...