gurpsone
gurpsone

Reputation: 483

How to draw a full screen quad and still see the objects behind it

I am creating a 3D game. I have objects in my game. When an enemy hits my position I want my screen to go red for a short time. I have chosen to do this by trying to render a full screen red square at my camera position. This is my attempt which is in my render method.

     RenderQuadTerrain();   

    //Draw the skybox
    CreateSkyBox(vNewPos.x,  vNewPos.y,  vNewPos.z,3500,3000,3500);
    DrawCoins();

    CollisionTest(g_Camera.Position().x, g_Camera.Position().y, g_Camera.Position().z);
    DrawEnemy();
    DrawEnemy1();

    //Draw SecondaryObjects models
    DrawSecondaryObjects(); 

    //Apply lighting effects
    LightingEffects();
    escapeAttempt();
if(hitbyenemy==true){
    glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE); // additive blending
float blendFactor = 1.0;
glColor3f(blendFactor ,0,0); // when blendFactor = 0, the quad won't be visible. When    blendFactor=1, the scene will be bathed in redness

    glBegin(GL_QUADS);                      // Draw A Quad
    glVertex3f(-1.0f, 1.0f, 0.0f);              // Top Left
    glVertex3f( 1.0f, 1.0f, 0.0f);              // Top Right
    glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
    glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
glEnd();
}

All this does, however, is turn all of the objects in my game a transparent colour, and I can't see the square anywhere. I don't even know how to position the quad. I'm very new to openGL.

How my game looks without an attempt to render a quad: enter image description here

How my game looks after my attempt: enter image description here

With Kevin's code and glDisable(GL_DEPTH_TEST); enter image description here

EDIT: I have changed the code to the below paste..still looks like image 1.

http://pastebin.com/eiVFcQqM

Upvotes: 1

Views: 2277

Answers (1)

Kevin Reid
Kevin Reid

Reputation: 43782

There are several possible contributions to the problem:

  • You probably want regular blending, not additive blending; additive blending will not turn white, yellow, or purple objects red. Change the blend func to glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); and use a color of glColor4f(1, 0, 0, blendFactor);

  • You should glDisable(GL_DEPTH_TEST); while drawing the overlay, to prevent it from being hidden by other geometry, and reenable it afterward (or use glPush/PopAttrib(GL_ENABLE_BIT)).

  • The projection and modelview matrixes should be the identity, to ensure a quad with those coordinates covers the entire screen. (However, you may have that implicitly already, since you say it is affecting the full screen, just not in the right way.)

If these suggestions do not fix it, please edit your question showing screenshots of your game with and without the red flash so we can understand the problem better.

Upvotes: 2

Related Questions