0

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

我在形状的构造函数中定义了显示列表,并在渲染方法中调用了显示列表。

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

这是我的过程的一些示例代码:

//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);
}

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

4

2 回答 2

1

我想给我的 2 美分。

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

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

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

于 2011-08-01T07:39:14.437 回答
-2

你可能得不到你想要的东西的原因仅仅是因为它已经不存在了。在我阅读 openGL 红皮书的时候,我注意到显示列表在 openGL 3.1 及更高版本中已被弃用(意味着简单地删除)并且谷歌搜索证实了这一点。我不记得原因了,但我相信是因为它把 VAO 和 VBO 搞乱了。因此,如果您使用高于 opengl 3.1 的版本,您将不再获得显示列表。

于 2011-07-30T23:23:15.893 回答