Archive 17/01/2023.

Change viewport rendertarget to other format

ucupumar

Hello Urhoheads! :mrgreen:
How to change default viewport rendertarget to HDR(rgba16f) format?

I tried to use this xml snippets.

<replace sel="/renderpath/rendertarget[@name='viewport']/@format">rgba16f</replace> It’s copied from PrepassHDR renderpath, but I changed the name from ‘light’ to ‘viewport’.
Unfortunately, it doesn’t work.

Anyone know why?

cadaver

You cannot change the backbuffer format. Instead, you would need to render all scene passes to a high bitdepth intermediate buffer, and finally blit that result to the backbuffer.

Something like this (I don’t guarantee that this works)

<renderpath>
    <rendertarget name="hires" sizedivisor="1 1" format="rgba16f" />
    <command type="clear" color="fog" depth="1.0" stencil="0" output="hires" />
    <command type="scenepass" pass="base" vertexlights="true" metadata="base" output="hires" />
    <command type="forwardlights" pass="light" output="hires" />
    <command type="scenepass" pass="postopaque" output="hires"/>
    <command type="scenepass" pass="refract" output="hires">
        <texture unit="environment" name="viewport" />
    </command>
    <command type="scenepass" pass="alpha" vertexlights="true" sort="backtofront" metadata="alpha" output="hires" />
    <command type="scenepass" pass="postalpha" sort="backtofront" output="hires" />
    <command type="quad" vs="CopyFrameBuffer" ps="CopyFrameBuffer" output="viewport">
        <texture unit="diffuse" name="hires" />
    </command>
</renderpath>
ucupumar

Thanks for the answer!
But there’s two problem using your solution.

The first one, MSAA won’t work. After searching on the internet, I think this was common problem of HDR rendering. I guess I can use postprocess AA. :unamused:

The second issue is copyframebuffer won’t work in Linux. I don’t know why, but it will display just black on Linux. It’s okay when I’m on Windows.
I tested using Ubuntu 12.04 with Geforce 460 (blob driver v331).
Do you know about this issue?

cadaver

Can you reproduce the problem on a Windows OpenGL build?

ucupumar

I’ve tested and this issue didn’t happen on Windows OpenGL.
Do you know something about this?

cadaver

It may mean two things: the Linux driver has a bug, or Urho is using the float rendertarget somehow incorrectly, which the Windows driver lets pass, but the Linux driver properly errors out.

ucupumar

I’ll do another test and investigate the real problem on my linux box. I just haven’t got chance to do it, but I’ll eventually try it again maybe tonight. :unamused:

ucupumar

I found the problem. This is because of common case sensitive problem between OS. Post process refer to CopyFrameBuffer, but the filename is CopyFramebuffer.glsl/hlsl.
It’s okay on Windows, but it’s a problem on Linux.

I created simple pull request to fix this problem: https://github.com/urho3d/Urho3D/pull/515