Jump to content

If Main Input Camera have post effect, extra layer is not visible


Dreikblack
 Share

Recommended Posts

I have main input camera with render target to main sprite.

Also i have extra input camera for transparent object that should looks same when they overlapping, targets to extra sprite. This sprite above main sprite.

Both sprites are rendered to orthographic projection camera.

Issue is that extra sprite (red rectangles) is not visible if i apply PostEffect or MSAA to main input camera.

Not sure if it's a bug or there is a workaround.

Tried apply MSAA to overlay camera - no MSAA effect then.

Without MSAA:

image.png.68d4e42b1a7dff14c2829b51fd4f9fb5.png

With it:

image.png.9db07ecec41f58a85f0ee85513b9c762.png

#include "UltraEngine.h"
#include "ComponentSystem.h"

using namespace UltraEngine;

int main(int argc, const char* argv[]) {
    auto displays = GetDisplays();
    auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);
    auto world = CreateWorld();
    auto framebuffer = CreateFramebuffer(window);

    auto sz = framebuffer->GetSize();
    int MAIN_LAYER = 1, OUTPUT_LAYER = 2, EXTRA_LAYER = 4;

    auto light = CreateBoxLight(world);
    light->SetRotation(35, 45, 0);
    light->SetRange(-10, 10);

    auto backBox = CreateBox(world, 5);
    backBox->SetPosition(0, 0, 7);
    backBox->SetColor(0, 1, 0, 1);

    auto betweenBox = CreateBox(world);
    betweenBox->SetRenderLayers(EXTRA_LAYER);
    betweenBox->SetColor(1, 0, 0, 1);
    auto unlitShader = LoadShaderFamily("Shaders/Unlit.fam");
    auto boxMat = CreateMaterial();
    boxMat->SetShaderFamily(unlitShader);
    betweenBox->SetMaterial(boxMat);
    auto betweenBox2 = CreateBox(world);
    betweenBox2->SetPosition(0.5, 0.5, 0);
    betweenBox2->SetRenderLayers(EXTRA_LAYER);
    betweenBox2->SetColor(1, 0, 0, 1);
    betweenBox2->SetMaterial(boxMat);

    auto frontBox = CreateBox(world, 1);
    frontBox->SetPosition(-0.5, 0, -0.5);
    frontBox->SetColor(1, 1, 0, 1);

    auto mainCameraInput = CreateCamera(world);
    mainCameraInput->SetPosition(0, 0, -3);
    mainCameraInput->SetRenderLayers(MAIN_LAYER);

    auto mainTextureBuffer = CreateTextureBuffer(sz.x, sz.y);
    mainCameraInput->SetRenderTarget(mainTextureBuffer);
    mainCameraInput->SetMsaa(2);

    auto mainSprite = CreateSprite(world, sz.x, sz.y);
    mainSprite->SetRenderLayers(OUTPUT_LAYER);
    auto mainMaterial = CreateMaterial();
    mainMaterial->SetShaderFamily(unlitShader);
    mainMaterial->SetTexture(mainTextureBuffer->GetColorAttachment());
    mainSprite->SetMaterial(mainMaterial);

    auto mainCameraOutput = CreateCamera(world, PROJECTION_ORTHOGRAPHIC);
    mainCameraOutput->SetPosition(sz.x * 0.5f, sz.y * 0.5f, 0);
    mainCameraOutput->SetRenderLayers(OUTPUT_LAYER);
    mainCameraOutput->SetLighting(false);
    mainCameraOutput->SetClearMode(CLEAR_DEPTH);

    //red transporent boxes render part
    auto extraCameraInput = CreateCamera(world);
    extraCameraInput->SetPosition(0, 0, -3);
    extraCameraInput->SetRenderLayers(EXTRA_LAYER);
    extraCameraInput->SetMatrix(mainCameraInput->matrix);
    extraCameraInput->SetClearMode(CLEAR_COLOR);
    extraCameraInput->SetLighting(false);
    extraCameraInput->SetFogColor(0, 0, 0, 1);
    extraCameraInput->SetFogAngle(90, 91);
    extraCameraInput->SetFog(true);
    auto range = extraCameraInput->GetRange().y;
    extraCameraInput->SetFogRange(range * 0.98, range * 0.99);

    auto extraTextureBuffer = CreateTextureBuffer(sz.x, sz.y);
    extraTextureBuffer->SetDepthAttachment(mainTextureBuffer->GetDepthAttachment());
    extraCameraInput->SetRenderTarget(extraTextureBuffer);

    auto extraSprite = CreateSprite(world, sz.x, sz.y);
    extraSprite->SetPosition(0, 0, -0.00001);
    extraSprite->SetRenderLayers(OUTPUT_LAYER);
    extraSprite->SetShadows(false);
    auto extraMaterial = CreateMaterial();
    extraMaterial->SetShaderFamily(unlitShader);
    extraMaterial->SetTransparent(true);
    extraMaterial->SetTexture(extraTextureBuffer->GetColorAttachment());
    extraMaterial->SetColor(1, 1, 1, 0.5);
    extraSprite->SetMaterial(extraMaterial);
    extraSprite->SetHidden(false);

    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false) {
        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...