отображение списков не будет выполняться - PullRequest
0 голосов
/ 30 июля 2011

Я пытаюсь создать инструмент, который будет рисовать фигуру в openGL, а затем изменить значения свойств этой фигуры в форме окна.Поэтому, если моя форма представляет собой прямоугольник, я создам форму, которая позволит пользователю контролировать размер, цвет и т. Д. Прямоугольника.Я написал код openGL на управляемом c ++ и форму на 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);
}

В этом примере будет отрисована граница прямоугольника, но сам прямоугольник не будет отрисован ... если язамените список отображения просто вызовом метода, прямоугольник будет отображаться нормально.Кто-нибудь знает, почему это может происходить?

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Я хочу дать свои 2 цента.

Код в вашем вопросе мне кажется правильным, поэтому, возможно, в вашем приложении есть что-то еще, что делает ваш список отображения неработоспособным.

Единственное, о чем я могу думать, это отсутствие текущего контекста при составлении списка отображения (в действительности, при выполнении конструктора GlRectangle).Итак, эта процедура выполняется в том же потоке, который вызвал glMakeCurrent?Эта процедура вызывается после glMakeCurrent?

Далее, проверяйте с glGetError после каждой подпрограммы OpenGL для проверки операции.В случае, если он возвращает ошибку, вы можете знать, что не так в вашем коде ..

0 голосов
/ 31 июля 2011

Причина, по которой вы можете не получить то, что вы хотите, просто потому, что ее больше нет. В то время, когда я читал Красную книгу openGL, я заметил, что списки отображения устарели в openGL 3.1 и выше (значит просто удалены), и поиск в Google подтвердил это. Я больше не помню причину, но я верю, потому что это портит ВАО и ВБО. Поэтому, если вы используете версию выше opengl 3.1, вы больше не будете получать списки отображения.

...