glPolygonMode(GL_FRONT_AND_BACK, GL_LINES)无效。

6
我会尝试以普通填充模式渲染基元,然后再以线框模式渲染。
渲染代码:
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);

显示列表创建代码:

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宏:

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

我希望能够绘制一个青色的飞机,并在周围画上黑色的框架,但出现的情况是第二次渲染显示列表时,它只是填充并绘制整个图像,覆盖其他基元素的像素。最终绘制出了所需的飞机,但只有黑色(我为线条“版本”指定的颜色)。
可能有用的其他信息是,我在Windows 7上使用SDL和MSVC++ 2010。我没有调用glEnable,因此没有启用任何会混淆或解决问题的奇怪设置。我的OpenGL设置代码仅设置投影和模型视图矩阵,然后创建显示列表。
显然,我的问题是为什么第二次绘制显示列表时它会填充原始图形而不是创建线条?我该如何解决这个问题?

为什么要使用宏?glColor3ub()有什么问题吗? - genpfault
哇,我以前不知道这个(我在OpenGL方面还是新手),好的,谢谢,我从现在开始会用了! - Name
1个回答

14
根据OpenGL 4.0中glPolygonMode文档,第二个参数mode只能是GL_FILLGL_POINTGL_LINE之一。 在你的示例中,你正在传递GL_LINES,这是完全不同的枚举值。
我怀疑OpenGL会处理传递GL_LINES,如果接收到的模式不符合其预期,则默认回退到GL_FILL
另请注意:对于glPolygonMode的规范在OpenGL 2.1中也是相同的。

2
我为自己犯下了似乎是最愚蠢的编程错误而感到庆幸;虽然这两个宏如此相似有点烦人,但无论如何还是谢谢! - Name
2
@ForgiveMeI'mAN00b 如果我每犯一次同样的错误就有一美元,那我现在早就富了... :) - kevintodisco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接