2015-04-09 3 views
1

У меня возникла проблема с созданием объекта до инициализации контекста. Мой код выглядит примерно так:Использование функций OpenGL в конструкторе объектов без контекста загружено

.. 
Vertex vertices[] = { ... } // declaration of object Vertices 
Mesh mesh(vertices, sizeof(vertices)/sizeof(vertices[0])); 
.. 
.. 
void onDisplay() 
{ 
    .. 
    mesh.Draw(); 
    .. 
} 
void init() { .. } 
int main(int argc, char** argv) 
{ 
    .. 
    glutDisplayFunc(onDisplay); 
    .. 
} 

Как я прочитал на OpenGL site, проблема заключается в том, что объект создается до контекста инициализации (из кода в конструкторе). Если бы я поставил «сетку» и «вершины» в «void init()», это решило бы проблему, но я не мог использовать метод «mesh.Draw()» в «void onDisplay» - потому что объект-сетка не является глобальным, объявляется только в init().

На сайте OpenGL они рассказывают о том, как исправить это, но я действительно не понимаю, что я должен делать.

Решение с сайта OpenGL таково:

  • Не используйте конструктор/деструкторы для инициализации/уничтожать объекты OpenGL. Вместо этого используйте функции-члены этих классов для этих целей. Это нарушает принципы RAII, поэтому это не лучший курс действий.
  • Создайте конструкторы объектов OpenGL, если контекст еще не создан. Для этого требуется дополнение к вашей функции создания контекста, которая сообщает вашему коду, когда контекст был создан и активен.
  • Создайте класс, которому принадлежат все другие объекты, связанные с OpenGL. Этот класс также должен отвечать за создание контекста в его конструкторе.

Решение 1 не рекомендуется, решение 2 не помогло бы мне (по крайней мере, я думаю, что нет), и я понятия не имею, как я хотел бы сделать раствор 3

+1

_ «но я действительно не понимаю, что я должен делать». _ Что конкретно вы не поняли? –

+0

Я не понял решение 3. Я думаю, что решение 2 не помогло бы мне, и решение 1 не рекомендуется, как они сказали. –

+0

_ «Я не понял решение 3». _ Каковы эти решения на самом деле? [Пожалуйста, отредактируйте свой вопрос] (http://stackoverflow.com/posts/29545120/edit) и покажите предлагаемые решения, а также то, что вам не хватает. Ссылки, указывающие на ресурсы вне сайта, скорее всего, не будут сопровождаться читателями вашего вопроса (например, я). Также, если вы связываете, сделайте это точно (вы имели в виду эту конкретную [главу] (https://www.opengl.org/wiki/Common_Mistakes#OOP_and_hidden_binding)?). –

ответ

1

Изменение vertices и mesh быть (умный) указатели и построить объекты в main() после того, как вы защитите контекст GL.

Если вы не хотите, чтобы изменить существующий код (. к -> для доступа к члену), вы можете называть их verticesPtr и meshPtr и создавать локальные ссылки (Mesh& mesh = *meshPtr;) в верхней части функций, где они упоминаются.

+0

Так что я попытался понять это самостоятельно, к сожалению без везения. Я действительно новичок в C++, поэтому я не понимаю указателей и как много работать с ними. То, что вы говорите, заключается в том, что я должен изменить объявление 'mesh' и' vertices' как указатели: 'Вершины * verticesPtr [];' и 'Mesh * meshPtr;' Но тогда как я их создаю в своем ' Основной() '? –