How does rendering to a higher resolution RenderTarget and then downsampling to a Drawable cause image distortion?

Rendering the scene onto a RenderTarget with twice the resolution of the Drawable, and then downsampling to the Drawable, causes the image to appear distorted. Modifications were made on the Xcode VisionOS template Foveation should be enabled by default

struct ContentStageConfiguration: CompositorLayerConfiguration {
    func makeConfiguration(capabilities: LayerRenderer.Capabilities, configuration: inout LayerRenderer.Configuration) {
        configuration.depthFormat = .depth32Float
        configuration.colorFormat = .bgra8Unorm_srgb
    
        let foveationEnabled = capabilities.supportsFoveation
        configuration.isFoveationEnabled = foveationEnabled
        
        let options: LayerRenderer.Capabilities.SupportedLayoutsOptions = foveationEnabled ? [.foveationEnabled] : []
        let supportedLayouts = capabilities.supportedLayouts(options: options)
        
        configuration.layout = supportedLayouts.contains(.layered) ? .layered : .dedicated
    }
}

To avoid errors, rasterizationRateMap is not set.

        var renderPassDescriptor = MTLRenderPassDescriptor()
        renderPassDescriptor.colorAttachments[0].texture = self.renderTarget.currentFrameColor
        renderPassDescriptor.renderTargetWidth = self.renderTarget.currentFrameColor.width
        renderPassDescriptor.renderTargetHeight = self.renderTarget.currentFrameColor.height
        renderPassDescriptor.colorAttachments[0].loadAction = .clear
        renderPassDescriptor.colorAttachments[0].storeAction = .store
        renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
        renderPassDescriptor.depthAttachment.texture = self.renderTarget.currentFrameDepth
        renderPassDescriptor.depthAttachment.loadAction = .clear
        renderPassDescriptor.depthAttachment.storeAction = .store
        renderPassDescriptor.depthAttachment.clearDepth = 0.0
        //renderPassDescriptor.rasterizationRateMap = drawable.rasterizationRateMaps.first
        if layerRenderer.configuration.layout == .layered {
            renderPassDescriptor.renderTargetArrayLength = drawable.views.count
        }

The rendering process is as follows:

Answered by DTS Engineer in 789446022

As discussed separately, disabling the rasterization rate map required for foveated rendering will result in this distortion.

//renderPassDescriptor.rasterizationRateMap = drawable.rasterizationRateMaps.first

Again, on device, foveated rendering with variable rate rasterization requires a rasterization rate map.

As discussed separately, disabling the rasterization rate map required for foveated rendering will result in this distortion.

//renderPassDescriptor.rasterizationRateMap = drawable.rasterizationRateMaps.first

Again, on device, foveated rendering with variable rate rasterization requires a rasterization rate map.

For more information please watch Render Metal with passthrough in visionOS.

The distinction between texture size and the VRR physical size is important.

How does rendering to a higher resolution RenderTarget and then downsampling to a Drawable cause image distortion?
 
 
Q