|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.09.2010, 20:50 | #1 |
Пользователь
Регистрация: 09.05.2009
Сообщений: 25
|
Проблемы с OpenGL
Доброе время суток!
Пишу программку на С++, юзаю OpenGL. Необходимо, что бы создавалась куча небольших GL'евских окошек, в которых отрисовка происходила вне зависимости от действий над окнами и во всех сразу. Код следующий: Регистрация класса: Код:
Код:
Код:
В общем, ай нид хелп. Заранее спасибо =)
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru
Последний раз редактировалось Koshmarovsky; 06.09.2010 в 21:44. |
06.09.2010, 21:46 | #2 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
А где и как происходит инициализация openGL rendering context (wglCreateContext, wglMakeCurrent)?
Инструкция говорит, что один и тот же rendering context не может быть текущим для нескольких потоков одновременно. И уж тем более, rendering context созданный в одном процессе будет недействительным в другом. Может тут проблема? |
06.09.2010, 22:07 | #3 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
Кстати, это не по теме вопроса, но может стоит после SwapBuffers поставить ValidateRect(hwnd,0), а то WM_PAINT будет стоять в очереди постоянно.
|
06.09.2010, 22:22 | #4 | ||
Пользователь
Регистрация: 09.05.2009
Сообщений: 25
|
Цитата:
Код:
Цитата:
Провел еще один тест: выводил, для какого из окон пришло WM_PAINT прямо при обработке сообщения в WndProc. WM_PAINT приходит только активному окну, но даже если какое-либо не последнее окно активно, то отрисовки не происходит (даже в последнем). У меня уже мозг вскипел... Пойду посплю, может поможет... =)
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru
Последний раз редактировалось Koshmarovsky; 06.09.2010 в 22:31. |
||
06.09.2010, 22:58 | #5 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
Есть мнение, что все окна создаются в одном (главном) потоке процесса. Т.е. текущим контекстом потока устанавливается контекст окна созданного последним.
Предлагаю сразу за созданием контекста окна поставить следующее, сразу после Код:
Код:
Код:
Код:
Последний раз редактировалось f.hump; 06.09.2010 в 23:01. |
07.09.2010, 05:30 | #6 |
Пользователь
Регистрация: 09.05.2009
Сообщений: 25
|
Смысл понял, сделал.
Результат: при запуске каждое окно прорисовывается только 1 раз. Если убрать ValidateRect(hWnd,0); (которая послед SwapBuffers()), то постоянно прорисовывается активное окно. Только прорисовывается не до конца. Вот код функции DrawGLScene(): Код:
Опять же, при бесконечной посылке из отдельного потока всем окнам WM_PAINT рисуются только черные прямоугольники, без квадрата. Этот эффект вообще не ясен... К тому же в идеал нужно, что бы не активные окна так же постоянно перерисовывались без отдельного спамящего потока. Как это можно сделать?
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru
Последний раз редактировалось Koshmarovsky; 07.09.2010 в 05:33. |
07.09.2010, 12:56 | #7 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
Не совсем понятно, что значит прорисовывается не до конца.
WM_PAINT не то сообщение которое можно рассылать напрямую, для этого есть функции UpdateWindow, RedrawWindow. Если хочется рассылать сообщение, то рассылать WM_PRINT. Последний раз редактировалось f.hump; 07.09.2010 в 12:59. |
07.09.2010, 15:47 | #8 | |
Пользователь
Регистрация: 09.05.2009
Сообщений: 25
|
Цитата:
Раньше (до изменений с wglMakeCurrent(hDC,hRC)) окна не прорисовывались вообще, то есть если расположить какое-либо левое окно поверх GL'евских, а потом свернуть его, то в GL'евских окнах оставались куски свернутого окна. Вот. UpdateWindow() никакого видимого эффекта не дало. В принципе могу выложить все исходники проекта (или весь проект), если есть время и/или желание копаться в чужом коде... =)
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru
|
|
07.09.2010, 15:58 | #9 |
Пользователь
Регистрация: 09.05.2009
Сообщений: 25
|
Для ясности:
Окна вообще не прорисовываются (остались куски свернутого Chrome'a) Окна не прорисовываются вообще (остались куски свернутого Chrome'a).bmp Окна прорисовываются не до конца: Окна прорисовываются не до конца.bmp Последнее окно полностью прорисовывается (зеленый квадрат двигается влево-вправо) Последнее окно полностью прорисовывается (квадрат двигается влево-вправо).bmp
Иногда мне кажется, что компилятор просто игнорирует все мои комментарии. (с) Bash.org.ru
Последний раз редактировалось Koshmarovsky; 07.09.2010 в 16:00. |
07.09.2010, 17:02 | #10 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
Я вообще-то думал про RedrawWindow, UpdateWindow вызывает WndProc если update region не пуст, так что фиг его знает как оно будет, плюс есть ненулевой шанс завалить или подвесить програму. Попробуй после SwapBuffers поставить
Код:
Кстати, причиной может быть то, что OpenGL конфигурируется только в контексте окна созданного последним, а для остальных х.з. Так что проблема скорее всего и даже наверняка не с WP_PAINT. Последний раз редактировалось f.hump; 07.09.2010 в 17:15. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
OpenGl | macintoshka12 | Общие вопросы C/C++ | 2 | 21.04.2010 12:59 |
проблемы с opengl. | elenza | Помощь студентам | 1 | 19.11.2009 22:54 |
Opengl | Алексадр | Компоненты Delphi | 4 | 29.09.2009 17:23 |
OpenGL | Paul_AG | C++ Builder | 20 | 14.09.2009 19:07 |
OpenGL | yanl | Компьютерное железо | 0 | 16.11.2008 00:52 |