| PMG http://forum.pmg.org.ru/ |
|
| Ничего не отрисовывается внутри функции http://forum.pmg.org.ru/viewtopic.php?f=1&t=383 |
Страница 1 из 1 |
| Автор: | WandereR [ 27 мар 2006 23:00 ] |
| Заголовок сообщения: | Ничего не отрисовывается внутри функции |
Дело вот в чем: в программе есть класс который реализует отрисовку CRender. В нем есть массив указателей на другой класс CPosition: там координаты того что надо рисовать + флажок само оно рисуеться или функцией по-умолчанию. В цикле получения сообщения вызыветься Функция DrawScene Код: int DrawGLScene(CRenderClass Render) { static CFlag flag1(20,20,BLUE_FLAG); static CFlag flag2(30,30,RED_FLAG); static BOOL init=FALSE; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); if(!init) { Render.AddObject((CPosition*)&flag1); Render.AddObject((CPosition*)&flag2); init=TRUE; } Render.UpdateCamera(); Render.RenderAll(); return TRUE; } Она добавляет два объекта для отрисовки и соответственно рисует Рисование сводиться к рисованию ландшафта и объектов на нем (в данном случае flag1/2) UpdateCamera просто делает Код: void CRenderClass::UpdateCamera(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(xspin,1,0,0); glRotatef(-yspin,0,1,0); glTranslatef(-x,-y,-z); } А вот реализация RenderAll: Код: void CRenderClass::RenderAll(void) { CSelfDrawable *draw; RenderHeightMap(); for (int i=0;i<objCount;i++) if(objects[i]->drawfunc) { draw=reinterpret_cast<CSelfDrawable*>(objects[i]); draw->Draw(); } } И тут начинаеться самое интересное: Если мы просто берем реализацию ф-ции Draw и подставляем в RenderAll (т.е просто код вставить),то все работает без проблем. Если же оставить так то ландшафт рисуеться а вот флаги - нет. Если же мы уберем из UpdateCamera Код: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); и вставим в реализацию ф-ции драв то флаги отрисовываются, ну соответсвенно ландшафт рисуется не там но факт в том что флаги отрисовываются. Если даже закоментить RenderHeightMap то получается что внутри процедуры Draw отрисовка идет только со сбрасыванием битов глубины и цвета, а если поместить код внутрь метода RenderAll То работает без проблем... Может кто подскажет в чем дело? Если что-то не понятно в изложении, то поясню. |
|
| Автор: | WandereR [ 29 мар 2006 15:32 ] |
| Заголовок сообщения: | |
Неужели никто не знает в чем тут дело? Или я просто не очень понятно изложил? |
|
| Автор: | NetLib [ 29 мар 2006 17:01 ] |
| Заголовок сообщения: | |
Ну хотя бы код функции Draw привели - ведь ссылаетесь на нее. К тому же из приведенного кода не видно, где у вас вызываются функции glBegin glEnd. Абсолютно нет котнтроля возвращаемых функциями значений. А в связи вот с этим фрагментом if(objects[i]->drawfunc) { draw=reinterpret_cast<CSelfDrawable*>(objects[i]); draw->Draw(); } хотелось бы увидеть объявления object[] и CSelfDrawable. |
|
| Автор: | WandereR [ 29 мар 2006 21:44 ] |
| Заголовок сообщения: | |
Реализация функции Draw Значения не имеет: там может быть все что угодно просто прямоугольник, треугольник - не важно. Важно то что при вызове этой функции инструкции в ней выполняються (в отладчике смотрел), а эффекта 0. Если мы просто методом cut->past заменяем вызов Draw кодом Draw или очищаем бит глубины и цвета в самой Draw то инструкции отрисовываються. Что касается CselfDrawable то это класс унаследованный от CPosition а objects это массив указателей на CPosition. Больше всего меня интересует почему необходимо очищение буфера глубины и цвета в САМОЙ ф-ции, а не до нее... даже если поставить очистук НЕПОСРЕДСТВЕННО перед вызовом Draw Отрисовки не будет. Я не очень силен в OpenGL поэтому за советом к вам и обращаюсь. |
|
| Автор: | MagicWolf [ 30 мар 2006 09:00 ] |
| Заголовок сообщения: | |
В функции DrawGLScene у тебя два раза проходит: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); В этом и проблема. Добавь вывод флагов как обычные объекты и проблем не будет. |
|
| Автор: | WandereR [ 30 мар 2006 23:49 ] |
| Заголовок сообщения: | |
Не совсем понял что значит вывод флагов как обычных объектов... Не могли бы вы пояснить. Попробовал убрать glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); из DrawGLScene, оставив только в UpdateCamera (я правильно понял это имелось ввиду?) результат аналогичен отрисовка кода происходит только при помещении этого самого кода непосредственно в RenderAll. |
|
| Автор: | WandereR [ 31 мар 2006 00:00 ] |
| Заголовок сообщения: | |
Обнаружил еще один парадокс: Код: void CRenderClass::RenderAll(void)
{ CSelfDrawable *draw; RenderHeightMap(); // DrawQuad(); for (int i=0;i<objCount;i++) if(objects[i]->drawfunc) { DrawQuad(); draw=reinterpret_cast<CSelfDrawable*>(objects[i]); draw->Draw(); // DrawQuad(); } } DrawQuad() рисует квадрат. Если мы вызываем эту ф-цию до цикла то она отрисовывает, если внутри цикла до или после вызова виртуальной Draw() то не отрисовывает... Ничего не понимаю. |
|
| Автор: | WandereR [ 31 мар 2006 00:12 ] |
| Заголовок сообщения: | |
Вопрос снят решение найдено. Дело оказалось в том что объекты удалялись после и добавлялись не совсем корректно... Но вопрос с функцией DrawQuad() которая просто описана выше в фаиле как рисовалка квадрата отсался не понятым до сих пор... |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|