Archived

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

Dwarf with Axe

OpenGL Last post about 2D in OpenGL (so please stop!)

Recommended Posts

Dwarf with Axe    277
Are you guys just lazy!? There have been thousands of posts along the lines of "How do I do 2d in OpenGL" to "Duuuhde, I wunt too maek a two dee gaem in ohpun jee el; how do eye set uhp two dee???!?" I have developed a simple, nice, pretty way for all of you to have your 2D fun.
  
void glEnable2D()
{
	int vPort[4];

   glGetIntegerv(GL_VIEWPORT, vPort);

   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();

   glOrtho(0, vPort[2], 0, vPort[3], -1, 1);
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();
}

void glDisable2D()
{
   glMatrixMode(GL_PROJECTION);
   glPopMatrix();   
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();	
}

  
To use these two functions, simply call glEnable2D(), draw whatever you want to have 2D''d, then call glDisable2D(). Here''s an example:
  
void RenderScene()
{
  glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  
  glEnable2D();
    glBegin(GL_TRIANGLES);
      glColor3ub(255, 0, 0);
        glVertex2d(0, 0);
      glColor3ub(0, 255, 0);
        glVertex2d(100,0);
      glColor3ub(0, 0, 255);
        glVertex2D(50, 50);
    glEnd();
  glDisable2D();
}
  
See? Nice and small; Nice and simple. So please friends, don''t ask how to setup OpenGL in 2D mode... Because now you know. ~Jesse Lawson

Share this post


Link to post
Share on other sites
ZoomBoy    162
The best thing to do is store this message URL for further reference.

And then cut and paste.


ZoomBoy
Developing a iso-tile 2D RPG with skills, weapons, and adventure. See my old Hex-Tile RPG GAME, character editor, diary, 3D Art resources at Check out my web-site

Share this post


Link to post
Share on other sites
henrym    103
Lol! Dwarf, this is a legendary thread dude.

Im actually about to start a 2D game in OGL, but Im not up to doing the graphics (actually still in design ATM), but your post means I don''t have to look up MSDN.

I''ve bookmarked this thread and I''ll recommend it for anyone else who posts asking how to do 2D in OpenGL.

Henrym
My Site

Share this post


Link to post
Share on other sites
Ilici    862
quote:
Original post by Khawk
I added it to the forum FAQ. Now you just have to point people there.




People actually read that? The link to the FAQ should be half the size of the screen and say: "Read the FAQ or i will come to your house and eat your children." that should make it more effective.


Oh and Dwarf with Axe: how about some code for quad and rendering arbitrary sized bitmaps?

Share this post


Link to post
Share on other sites
owl    376
something (probably very easy) i couldn''t figure out is how to draw things in ortho using the default (float) cartesian space instead of using pixels...

Does somebody knows how to do it?

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
quote:
Original post by Ilici
The link to the FAQ should be half the size of the screen and say: "Read the FAQ or i will come to your house and eat your children." that should make it more effective.


Probably wouldn''t work so well. People who can''t find the FAQ are usually newbies. Newbies tend to be kids. Kids don''t have children.

How about "Read the FAQ or i will send a hideous winged deamon to haunt you and scare away the chicks, so that you''ll NEVER lose you virginity. MUHAHAHAH!"? Hmmm, not very catchy either

Share this post


Link to post
Share on other sites
quote:
Original post by owl
something (probably very easy) i couldn''t figure out is how to draw things in ortho using the default (float) cartesian space instead of using pixels...

Does somebody knows how to do it?


Use gluOrtho2D(0,1,0,1); to set up the proj matrix.

--------------------------------------------------------
Life would be so much easier if we could just get the source code.

Share this post


Link to post
Share on other sites
Puzzler183    540
OpenGL can just be annoying with 2D stuff. Things being a pixel off; it being a pixel off in various implementations, etc. is just irritating and is one reason I put my engine on hold. Also, the OpenGL PixelCopy functions are ridiculously slow.

I get the impression that things like that are more of a problem than setting up a window (although that can confuse people too)...

Share this post


Link to post
Share on other sites
weyland    122
Thanks from the bottom of my heart for making this thread sticky ...

If I ever see one more "how do I place a font/bitmap/jpg/HUD/tilebased/whateva on the screen in 2D" thread I''m leaving for Vegas

Share this post


Link to post
Share on other sites
Puzzler183    540
The thing is sometimes stuff is a pixel off if you use a textured quad and if you use PixelCopy, you get HORRIBLE performance. So actually, sometimes questiuons can be reasonable.

Share this post


Link to post
Share on other sites
Ilici    862
quote:
Original post by Puzzler183
Also, the OpenGL PixelCopy functions are ridiculously slow.



You mean glReadPixels? Yes, it''s slow, but it''s not necesseraly OpenGL''s fault. The AGP bus is optimized for writing to the Video memory, not retrieving data from it so reading back pixels, which requires the driver to lock the framebuffer in video memory and send data back on the bus to system memory is slow. If you want software rendering, i think MesaGL is what you are looking for.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
lol, i have almost the same exact functions in my game for drawing 2D UI stuff

- Voxelz

Share this post


Link to post
Share on other sites
Xiachunyi    556
Great Job on the sticky.

One thing though - On the implementation example, can you change the last "glVertex2D(50, 50);" to "glVertex2d(50, 50);" so newbies like me won''t have to use their brains.

Share this post


Link to post
Share on other sites
etothex    728
The same, essentially, except in lwjgl/java.

Haven''t tested it yet, but it compiles, so here it is. Licenced the same as the original.

(I was working on my snippet library and wanted to add this back to where it came from)


import org.lwjgl.opengl.GL11;

public final class OpenGL2D extends java.lang.Object {
public static void glEnable2D() {
java.nio.IntBuffer vPort = java.nio.IntBuffer.allocate(4);
GL11.glGetInteger(GL11.GL_VIEWPORT, vPort);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glPushMatrix();
GL11.glLoadIdentity();
GL11.glOrtho(0, vPort.get(2), 0, vPort.get(3), -1, 1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
GL11.glLoadIdentity();
}
public static void glDisable2D() {
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glPopMatrix();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glPopMatrix();
}
}

Share this post


Link to post
Share on other sites
fyhuang    253
Also, if you want to be able to access the screen in floating-point with the left side being -1.0 and the top being -1.0 (bottom and right still 1.0), you can do:

gluOrtho2D( 0.0, 0.0, 1.0, 1.0 );

[Edited by - fyhuang on August 31, 2005 11:25:03 AM]

Share this post


Link to post
Share on other sites

  • Similar Content

    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
    • By markshaw001
      Hi i am new to this forum  i wanted to ask for help from all of you i want to generate real time terrain using a 32 bit heightmap i am good at c++ and have started learning Opengl as i am very interested in making landscapes in opengl i have looked around the internet for help about this topic but i am not getting the hang of the concepts and what they are doing can some here suggests me some good resources for making terrain engine please for example like tutorials,books etc so that i can understand the whole concept of terrain generation.
       
    • By KarimIO
      Hey guys. I'm trying to get my application to work on my Nvidia GTX 970 desktop. It currently works on my Intel HD 3000 laptop, but on the desktop, every bind textures specifically from framebuffers, I get half a second of lag. This is done 4 times as I have three RGBA textures and one depth 32F buffer. I tried to use debugging software for the first time - RenderDoc only shows SwapBuffers() and no OGL calls, while Nvidia Nsight crashes upon execution, so neither are helpful. Without binding it runs regularly. This does not happen with non-framebuffer binds.
      GLFramebuffer::GLFramebuffer(FramebufferCreateInfo createInfo) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); textures = new GLuint[createInfo.numColorTargets]; glGenTextures(createInfo.numColorTargets, textures); GLenum *DrawBuffers = new GLenum[createInfo.numColorTargets]; for (uint32_t i = 0; i < createInfo.numColorTargets; i++) { glBindTexture(GL_TEXTURE_2D, textures[i]); GLint internalFormat; GLenum format; TranslateFormats(createInfo.colorFormats[i], format, internalFormat); // returns GL_RGBA and GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, createInfo.width, createInfo.height, 0, format, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); DrawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); } if (createInfo.depthFormat != FORMAT_DEPTH_NONE) { GLenum depthFormat; switch (createInfo.depthFormat) { case FORMAT_DEPTH_16: depthFormat = GL_DEPTH_COMPONENT16; break; case FORMAT_DEPTH_24: depthFormat = GL_DEPTH_COMPONENT24; break; case FORMAT_DEPTH_32: depthFormat = GL_DEPTH_COMPONENT32; break; case FORMAT_DEPTH_24_STENCIL_8: depthFormat = GL_DEPTH24_STENCIL8; break; case FORMAT_DEPTH_32_STENCIL_8: depthFormat = GL_DEPTH32F_STENCIL8; break; } glGenTextures(1, &depthrenderbuffer); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, createInfo.width, createInfo.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthrenderbuffer, 0); } if (createInfo.numColorTargets > 0) glDrawBuffers(createInfo.numColorTargets, DrawBuffers); else glDrawBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer Incomplete\n"; glBindFramebuffer(GL_FRAMEBUFFER, 0); width = createInfo.width; height = createInfo.height; } // ... // FBO Creation FramebufferCreateInfo gbufferCI; gbufferCI.colorFormats = gbufferCFs.data(); gbufferCI.depthFormat = FORMAT_DEPTH_32; gbufferCI.numColorTargets = gbufferCFs.size(); gbufferCI.width = engine.settings.resolutionX; gbufferCI.height = engine.settings.resolutionY; gbufferCI.renderPass = nullptr; gbuffer = graphicsWrapper->CreateFramebuffer(gbufferCI); // Bind glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw here... // Bind to textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, textures[2]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); Here is an extract of my code. I can't think of anything else to include. I've really been butting my head into a wall trying to think of a reason but I can think of none and all my research yields nothing. Thanks in advance!
    • By Adrianensis
      Hi everyone, I've shared my 2D Game Engine source code. It's the result of 4 years working on it (and I still continue improving features ) and I want to share with the community. You can see some videos on youtube and some demo gifs on my twitter account.
      This Engine has been developed as End-of-Degree Project and it is coded in Javascript, WebGL and GLSL. The engine is written from scratch.
      This is not a professional engine but it's for learning purposes, so anyone can review the code an learn basis about graphics, physics or game engine architecture. Source code on this GitHub repository.
      I'm available for a good conversation about Game Engine / Graphics Programming
    • By C0dR
      I would like to introduce the first version of my physically based camera rendering library, written in C++, called PhysiCam.
      Physicam is an open source OpenGL C++ library, which provides physically based camera rendering and parameters. It is based on OpenGL and designed to be used as either static library or dynamic library and can be integrated in existing applications.
       
      The following features are implemented:
      Physically based sensor and focal length calculation Autoexposure Manual exposure Lense distortion Bloom (influenced by ISO, Shutter Speed, Sensor type etc.) Bokeh (influenced by Aperture, Sensor type and focal length) Tonemapping  
      You can find the repository at https://github.com/0x2A/physicam
       
      I would be happy about feedback, suggestions or contributions.

  • Popular Now