我正在尝试创建一个工具,它将在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);
}
在这个例子中,矩形的边框将被渲染,但是矩形本身不会被渲染...如果我用简单的方法调用替换显示列表,矩形就会被渲染得很好。有谁知道为什么会发生这种情况?
答案 0 :(得分:1)
我想给我2美分。
您的问题中的代码对我来说似乎是正确的,因此您的应用程序中可能还有其他内容会使您的显示列表无法运行。
我唯一能想到的是编译显示列表时没有当前的上下文(实际上在执行GlRectangle构造函数时)。那么,该例程是否在同一个调用glMakeCurrent的线程中执行?这个例程是在glMakeCurrent之后调用的吗?
此外,在每个OpenGL例程之后检查glGetError以验证操作。在它返回错误的情况下,您可以知道代码中的错误。
答案 1 :(得分:-2)
你可能无法得到你想要的东西只是因为它不再存在了。我及时阅读了openGL Red book,我注意到显示列表在openGL 3.1及更高版本中被弃用(意味着简单地删除)并且谷歌搜索确认了它。我不再记得理由,但我相信因为它搞乱了VAO和VBO。因此,如果您使用的是高于opengl 3.1,则不会再获得显示列表。