我的 blit 渲染功能适用于 VR 之外的 PC 和多通道渲染。但是在单通道实例化 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