Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Open GL как нарисовать в двух формах 
V
    Опции темы
Evgesha
Дата 29.8.2013, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 2.7.2005
Где: Германия

Репутация: нет
Всего: нет



Используеться Open GL и Builder C++

Вопрос такой

как рисовать на нескольких формах, то есть результат рисования показывало сразу на нескольких формах (как 3d Max c разных сторон)
на одной форме рисует нормально, а на двух только во второй, первая форма остаётся черная без объекта

Помогите пожайлуста

--------------------
Все это хорошо, а как дальше жить!!!
PM MAIL   Вверх
Amp
Дата 29.8.2013, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Завести по gl-контексту для разных окон. И рендерить в каждый по-отдельности.
PM MAIL   Вверх
Evgesha
  Дата 30.8.2013, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 2.7.2005
Где: Германия

Репутация: нет
Всего: нет



В том то и дело рендерю в отдельном окне и контекст отдельный

Код

void __fastcall TForm_Oben::FormCreate(TObject*Sender)
  {
    Form_Oben->BorderStyle = bsSizeable;
    Form_Oben->BorderIcons = TBorderIcons() >> biSystemMenu >> biMinimize >> biMaximize;
    Form_Oben->SetBounds(0, Form_Haupt->Height, Screen->Width / 2, Screen->Height / 2 - Form_Haupt->Height);
    //
    ghDC = GetDC(Form_Oben->Handle); // ghRC – указатель на контекст воспроизведения (Rendering Context)
    if (!bSetupPixelFormat(ghDC))
      Close();
    ghRC = wglCreateContext(ghDC); // ghDC – дескриптор устройства (для нас – просто указатель на окно)
    wglMakeCurrent(ghDC, ghRC);
    glClearColor(0.0, 0.0, 0.0, 0.0); // устанавливает чёрный цвет, которым будет заполняться экран при очищении.
    FormResize(Sender);
    // В OpenGL всё включается и выключается(разрешается и запрещается) процедурами glEnable и glDisable.Таким образом,
    glEnable(GL_COLOR_MATERIAL); // разрешили давать нашим объектам какой - то цвет(GL_COLOR_MATERIAL)
    glEnable(GL_DEPTH_TEST);     // мы разрешили тест глубины(GL_DEPTH_TEST), чтобы изображение было объёмным
    glEnable(GL_LIGHTING);       // разрешили освещение(GL_LIGHTING)
    glEnable(GL_LIGHT0);         // включили « лампочку № 0 »(GL_LIGHT0)
    float p[4] =
      {
        3,
        3,
        5,
        1
      } , d[3] =
      {
        -1,
        -1,
        -3
      } ;
    // устанавливает свойства «лампочек»: позицию и направление света
    glLightfv(GL_LIGHT0, GL_POSITION, p);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, d);
    //
  }
// ---------------------------------------------------------------------------


Код

void __fastcall TForm_Vorn::FormCreate(TObject*Sender)
  {
    Form_Vorn->BorderStyle = bsSizeable;
    Form_Vorn->BorderIcons = TBorderIcons() >> biSystemMenu >> biMinimize >> biMaximize;
    Form_Vorn->SetBounds(Screen->Width / 2, Form_Haupt->Height, Screen->Width / 2,
      Screen->Height / 2 - Form_Haupt->Height);
    //
    ghDC = GetDC(Form_Vorn->Handle); // ghRC – указатель на контекст воспроизведения (Rendering Context)
    if (!bSetupPixelFormat(ghDC))
      Close();
    ghRC = wglCreateContext(ghDC); // ghDC – дескриптор устройства (для нас – просто указатель на окно)
    wglMakeCurrent(ghDC, ghRC);
    glClearColor(0.0, 0.0, 0.0, 0.0); // устанавливает чёрный цвет, которым будет заполняться экран при очищении.
    FormResize(Sender);
    // В OpenGL всё включается и выключается(разрешается и запрещается) процедурами glEnable и glDisable.Таким образом,
    glEnable(GL_COLOR_MATERIAL); // разрешили давать нашим объектам какой - то цвет(GL_COLOR_MATERIAL)
    glEnable(GL_DEPTH_TEST);     // мы разрешили тест глубины(GL_DEPTH_TEST), чтобы изображение было объёмным
    glEnable(GL_LIGHTING);       // разрешили освещение(GL_LIGHTING)
    glEnable(GL_LIGHT0);         // включили « лампочку № 0 »(GL_LIGHT0)
    float p[4] =
      {
        3,
        3,
        5,
        1
      } , d[3] =
      {
        -1,
        -1,
        -3
      } ;
    // устанавливает свойства «лампочек»: позицию и направление света
    glLightfv(GL_LIGHT0, GL_POSITION, p);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, d);
    //
  }


что то не так smile 
--------------------
Все это хорошо, а как дальше жить!!!
PM MAIL   Вверх
Dem_max
Дата 31.8.2013, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Поток у форм один !!! Создавай отдельный TTHread для каждого GL рендеринга, а потом с каждого потока выводи на Tform


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Evgesha
Дата 31.8.2013, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 2.7.2005
Где: Германия

Репутация: нет
Всего: нет



ok попробую
--------------------
Все это хорошо, а как дальше жить!!!
PM MAIL   Вверх
Amp
Дата 1.9.2013, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Цитата(Dem_max @  31.8.2013,  05:46 Найти цитируемый пост)
Создавай отдельный TTHread для каждого GL рендеринга, а потом с каждого потока выводи на Tform 

Но зачем?
PM MAIL   Вверх
Dem_max
Дата 2.9.2013, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Цитата(Amp @ 1.9.2013,  19:25)
Цитата(Dem_max @  31.8.2013,  05:46 Найти цитируемый пост)
Создавай отдельный TTHread для каждого GL рендеринга, а потом с каждого потока выводи на Tform 

Но зачем?

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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Amp
Дата 2.9.2013, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Цитата(Dem_max @  2.9.2013,  05:45 Найти цитируемый пост)
чтобы OpenGL создавал новый контекст для рендеринга, а не пытался создавать новый в том же потоке. 

Так ТС же сам ручками создает контексты. От того, что они в одном или разных потоках разве что-то меняется?
PM MAIL   Вверх
Dem_max
Дата 2.9.2013, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



GL при создании контекста вызывает GetCurrentThread и сравнивает а не в одном ли треде создается контекст


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Amp
Дата 4.9.2013, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Цитата(Dem_max @  2.9.2013,  13:57 Найти цитируемый пост)
GL при создании контекста вызывает GetCurrentThread и сравнивает а не в одном ли треде создается контекст 

Это же от реализации драйвера зависит. Но даже если оно вызывает GetCurrentThread, дальше какая логика поведения? У меня несколько контекстов создается в одном UI-потоке - все нормально работает.
PM MAIL   Вверх
tzirechnoy
Дата 8.9.2013, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



А что FormCreate -- у вас оно только в FormCreate рисует? Тогда с этим могут быть проблемы, мало ли там при иницыализацыи что-то недоползло до контекста этого окна. Считается что оно должно перерисовываться 50 раз в секунду -- потому OpenGL не так уж бережно относится к нарисованным картинкам.

Если нет -- покажыте другой код. И, кстати, проверьте, где ghRC описан -- отдельный ли он для каждой формы.
PM MAIL   Вверх
Evgesha
Дата 17.11.2013, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 2.7.2005
Где: Германия

Репутация: нет
Всего: нет



 smile 
--------------------
Все это хорошо, а как дальше жить!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.