2011-07-29 4 views
0

Я пытаюсь создать инструмент, который будет нарисовать форму в 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

Не могли бы вы также указать функцию renderRect? Это может быть полезно. – Dany

+0

Добавлен метод renderRect. – eternalking

ответ

1

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

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

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

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

+0

В этом была проблема, я создавал контекст после того, как я создал форму. Моя фактическая программа значительно сложнее, чем пример, который я дал, поэтому я не заметил этого вначале. Спасибо за вашу помощь! – eternalking

-2

Причина, по которой вы не можете получить то, что хотите, просто потому, что ее больше нет. Со временем я читал красную книгу openGL, я заметил, что списки отображения устарели в openGL 3.1 и выше (значит просто удалены) и googling для этого подтвердили. Я больше не помню причины, но я верю, потому что это возилось с VAO и VBOs. Поэтому, если вы используете выше, чем opengl 3.1, вы больше не сможете отображать списки.

+0

-1, списки отображения устарели, но по-прежнему поддерживаются везде для совместимости. Устаревшие средства означают, что они есть, но не рекомендуется использовать их – Hannesh

+0

Прочтите более тщательно, устаревшие означает, что они удалены для удаления и не рекомендуется использовать их. Тот, кто (ATI, Nvidia, ...) решает удалить их, они могут свободно делать, и ATI плохо справляется с ними. Если вы не хотите использовать старые версии openGL, вы все равно не должны создавать новый проект по устаревшим вещам. Если бы они сохраняли совместимость ко всему, что было устаревшим, то что было бы противным? – Raven

+1

Нарушение @Raven связано с текущей версией OpenGL, которую вы используете как средство визуализации. Начиная с версии 3.0, были введены устаревшие версии, поэтому более низкая версия должна поддерживать устаревшие API. Вы не можете использовать устаревшие функции в контексте, совместимом с переходом, за исключением использования профиля совместимости. – Luca