Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как часто прорисовывать сцену? 
:(
    Опции темы
evilguard
Дата 6.12.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Запутался немного. Делаю небольшую программку по 3д-моделированию(узкоспециализированную). Она у меня строит 3х-мерную поверхность(по сути ландшафт), либо сама генерирует ее либо загружает из файла. Строит она ее с помощью GL_QUAD_STRIP. Есть также примитивный обзор. Вначале я 1 раз ее строю с помощью glVertex, а затем в функции OnDraw (использую MFC) только устанавливаю положение камеры, которое может изменяться при помощи мыши. OnDraw, как я понимаю то же самое что и IdleFunc? Но я еще видел реализации, где туда же засовывают не только функции для работы с камерой, но и заново строят поверхность. Как правильно?
PM MAIL   Вверх
Arks
Дата 6.12.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Прога рисует правильно? Ресурсов жрёт мало? Тогда забей  smile 
Серьёзно теперь:
OnDraw и OnIdle разные вещи.
OnDraw - событие, вызываемое, когда надо отрисовать форму: например, при изменении размеров или перекрытии части её другим окном.
OnIdle - вызывается, когда обработаны все события и в очереди сообщений, таковых больше нет - т.е. во время простоя программы.
Строить заново пов-сть или нет - что ты имеешь ввиду? Вывоз функций - glVertex? Если так, то да. Их надо вызывать каждый кадр, чтобы что-то нарисовать. Хочешь экономить на этом, то используй дисплейные списки glDisplaList или VBO (Vertex Buffer Object - статический, GL_STATIC_DRAW).
PM MAIL ICQ Skype MSN   Вверх
evilguard
Дата 7.12.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Arks
вот именно, что я 1 раз рисую какую-то поверхность(glVertex), а потом только изменяю положение камеры с glLookAt(), которую вызываю как раз в OnDraw. Все работает, просто не уверен в правильности подхода.
PM MAIL   Вверх
DENNN
Дата 7.12.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



перерисвоывать нужно только когда действительно нужно перерисовать smile Изменилось изображение, изменилась сцена, изменилось положение камеры/света, пришел запрос от ОС на "картинку окна" (функция OnDraw)
Согласись, что onIdle -это не тот случай.
PM ICQ   Вверх
evilguard
Дата 7.12.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



DENNN
Дело в том, что я брал из книжки заготовку приложения под MDI. Там нету onIdle. Есть OnDraw. Вот листинг ее:
Код

void COGView::OnDraw(CDC* /*pDC*/)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    SetLight();

    x1=x2+cam_r*cos(cam_b)*cos(cam_a);
    y1=y2+cam_r*sin(cam_b);
    z1=z2+cam_r*cos(cam_b)*sin(cam_a);


    int u;
    if (cam_b<0)
        cam_b=2*pi+cam_b;
    if (cam_b>2*pi)
        cam_b=cam_b-2*pi;

    if ((cam_b>pi/2)&&(cam_b<3*pi/2))
        u=-1;
    else
        u=1;

    gluLookAt(x1,y1,z1,x2,y2,z2,0,u,0);
    
    glCallList(1);
    SwapBuffers(m_hdc);
}

Мой код - связанный с положением камеры, остальное взял из заготовки. Рисую я только 1 раз, когда загружаю данные из файла.

Это сообщение отредактировал(а) evilguard - 7.12.2006, 22:18
PM MAIL   Вверх
Arks
Дата 8.12.2006, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



to DENN:
OnIdle - когда требуется частая прорисовка, с хорошим фпс. А то анимация тормозить будет. Если же её нет, то и вправду можно забить.
to evilguard:
Ну так у тебя сцена перерисовывается с помощью glCallList. Так что всё нормально. Т.к., как я пониаю, сцена статичная.
PM MAIL ICQ Skype MSN   Вверх
evilguard
Дата 8.12.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Arks
Да, сцена статическая. А функцию glCallList() я и не учел (я взял готовый исходник, разобрался только как рисовать). Значит буду копать по функциям опенГЛ. Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

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


 




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


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

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