glPolygonMode(GL_FRONT_AND_BACK, GL_LINES) isn't working
Asked Answered
U

1

6

I'm trying to render the primitives in a normal fill mode, then as a wire frame.

Render Code:

glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.9f, 0.9f, 0.9f, 1);
// reset matrix
glLoadIdentity();
// fill display list
glColor3c(150, 255, 255);
glCallList(lDList);
// wireframe display list
glColor3f(0, 0, 0);
glLineWidth(10);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINES);
glCallList(lDList);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

Display List Creation Code:

lDList = glGenLists(1);
glNewList(lDList, GL_COMPILE);
    glBegin(GL_QUADS);
        glVertex3i(-1, -1, 0);
        glVertex3i(1, -1, 0);
        glVertex3i(1, -1, -25);
        glVertex3i(-1, -1, -25);
    glEnd();
glEndList();

glColor3c Macro:

#define glColor3c(r, g, b) glColor3f(r / 255, g / 255, b / 255)

I'm expecting to get a cyan colored plane drawn with a black frame around it, but all that's happening is that the second time I render the display list, it's simply filling and drawing the entire thing, overwriting the pixels for the other primitive. I end up with the plane I want drawn, but its just black (the color I specified for the line "version").

Any other information that might be useful is that I'm using SDL, on Windows 7 with MSVC++ 2010. I do not make any calls to glEnable, so I have no weird settings enabled that would mess it up, or, perhaps solve the problem. My only OpenGL setup code sets up the projection and modelview matrix and then creates the display list.

Obviously my question is why is the second time I draw the display list is it filling the primitive instead of creating lines? How do I fix this?

Uninterested answered 7/11, 2012 at 2:57 Comment(2)
Why the macro? What was wrong with glColor3ub()?Sieber
wow I never knew about that (I'm still a newb in OpenGL), well thanks I'll use that from now on!Uninterested
D
14

According to the docs for glPolygonMode in OpenGL 4.0, the second argument, mode, may only be one of GL_FILL, GL_POINT, or GL_LINE. In your example, you are passing GL_LINES, which is an entirely different enum value.

I suspect that passing GL_LINES is handled by OpenGL such that it defaults back to GL_FILL if the received mode is not what it expects.

Also note: the specification for glPolygonMode is the same back through OpenGL 2.1.

Dodd answered 7/11, 2012 at 3:35 Comment(2)
I'm congratulating myself for making what seems to be my dumbest programming mistake yet; although that's annoying that the two macros are so similar, but w/e, thanks!Uninterested
@ForgiveMeI'mAN00b If I had a dollar for every time I've made this same mistake... :)Dodd

© 2022 - 2024 — McMap. All rights reserved.