显示列表不会运行

时间:2011-07-29 22:11:19

标签: opengl displaylist

我正在尝试创建一个工具,它将在openGL中绘制一个形状,然后在Windows窗体中修改该形状的属性值。因此,如果我的形状是一个矩形,我将创建一个允许用户控制矩形的大小,颜色等的表单。我已经用托管c ++和c#中的形式编写了openGL代码,并且由于其中一些形状变得更复杂,我决定为它们制作显示列表(出于性能和可预测性目的)。

我在构造函数中为形状定义显示列表,并在render方法中调用显示列表。

我的问题是我的显示列表根本不会运行。我将渲染在显示列表之外呈现的部分,但不会呈现显示列表中的部分。

以下是我的流程的一些示例代码:

//c# side
GLRectangle rect
public CSharpRectangle() {
    rect = new GLRectangle();
}

//managed c++ side
public GLRectangle() {
   width = 50;
   height = 50;
   //initialize more values
   rectDL = glGenLists(1);
   glNewList(rectDL, GL_COMPILE);
        renderRect();
   glEndList();
}
public render() {
     //Draw border
glBegin(GL_LINE_LOOP);
    glVertex2f(0, 0);
    glVertex2f(width, 0);
    glVertex2f(width, height);
    glVertex2f(0, height);
glEnd();

     //Draw interior
     glCallList(rectDL);
}
private renderRect() {
     glRectf(0,0,width,height);
}

在这个例子中,矩形的边框将被渲染,但是矩形本身不会被渲染...如果我用简单的方法调用替换显示列表,矩形就会被渲染得很好。有谁知道为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

我想给我2美分。

您的问题中的代码对我来说似乎是正确的,因此您的应用程序中可能还有其他内容会使您的显示列表无法运行。

我唯一能想到的是编译显示列表时没有当前的上下文(实际上在执行GlRectangle构造函数时)。那么,该例程是否在同一个调用glMakeCurrent的线程中执行?这个例程是在glMakeCurrent之后调用的吗?

此外,在每个OpenGL例程之后检查glGetError以验证操作。在它返回错误的情况下,您可以知道代码中的错误。

答案 1 :(得分:-2)

你可能无法得到你想要的东西只是因为它不再存在了。我及时阅读了openGL Red book,我注意到显示列表在openGL 3.1及更高版本中被弃用(意味着简单地删除)并且谷歌搜索确认了它。我不再记得理由,但我相信因为它搞乱了VAO和VBO。因此,如果您使用的是高于opengl 3.1,则不会再获得显示列表。