Archived

This topic is now archived and is closed to further replies.

Drawing in absolute pixels

This topic is 5780 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Sure. It's easy.

    

// Set the size of the view port

glViewport(0, 0, Width, Height);

// Use orthographica projection

glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Edit: Forgot to add this

glOrtho(0, Width, Height, 0, 0, 1);

// Render the objects

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Now you can draw stuff in pixel coordinates.

// The upper left is (0, 0)

// The lower right is (Width, Height)





Premature optimizations can only slow down your project even more.

Edited by - tangentz on February 16, 2002 3:27:01 PM

Share this post


Link to post
Share on other sites
Thank you but your answer only works to 50%. I want a rectangle which is 50 pixels wide and 768 pixels long. It's supposed to cover the left side of the monitor (as part of an GUI). The code I used is:

glPushMatrix();

glViewport(0, 0, WindowWidth, WindowHeight); // Set the size of the view port
glMatrixMode(GL_PROJECTION); // Use orthographica projection
glOrtho(0, WindowWidth, WindowHeight, 0, 0, 1);
// Render the objects
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
{
glVertex3f(0.0f , 0.0f, 0.0f);
glVertex3f(0.0f ,767.0f, 0.0f);
glVertex3f(50.0f,767.0f, 0.0f);
glVertex3f(50.0f, 0.0f, 0.0f);
}
glEnd();

glPopMatrix();

The rectangle is drawn perfectly, but the scene is translated 128 pixels right, and the rectangle is only 37 pixels wide. Why???

Edited by - Peaceman on February 16, 2002 1:34:03 PM

Share this post


Link to post
Share on other sites
Put a glLoadIdentity(); between glMatrixMode(GL_PROJECTION); and glOrtho(0, WindowWidth, WindowHeight, 0, 0, 1);

glOrtho, gluOrtho2D, gluPerspective, etc. are all matrix MULTIPLICATIONS. So if you want to replace the current matrix you should call glLoadIdentity first.

Also, it's probably better to change your glOrtho statement into this: glOrtho(0, WindowWidth, WindowHeight, 0, -1, 1); or this: glOrtho(0, WindowWidth, 0, WindowHeight, -1, 1);

Because otherwise drawing at depth 0 draws exactly at the near clipping plane. It's safer to draw between the near and far clipping planes.

Edited by - Scarab0 on February 16, 2002 3:09:26 PM

Share this post


Link to post
Share on other sites
quote:
Original post by Peaceman
Thank you, it works fine now, but why is a near clipping value of 0 a bad idea?


Well it''s not really a bad idea in Ortho mode. In fact it should always work if you''re drawing at depth 0.
-1 is just safer because 0 is definately between -1 and 1, with 0 and 1 it''s not that clear.
So maybe it''s just paranoid of me, but I prefer [-1, 1].

BTW, another tip: you can just use:
glVertex2f(0.0f , 0.0f); instead of glVertex3f because glVertex2f is equivalent to calling glVertex3f with a Z of 0. It''s shorter so maybe it''ll save you some time.

Share this post


Link to post
Share on other sites