воскресенье, 21 августа 2011 г.

Simple render. Описание идеи

Всем привет. 

Представляю вашему вниманию первую часть цикла для начинающих об отрисовке в играх. 
Сегодня мы рассмотрим идею в общем и набросаем стартовое приложение. 
Для работы с рендером я буду использовать библиотеку glut. В принципе она сейчас практически не используется, но нам подойдет идеально. Использование glut позволит мне сосредоточится на структуре классов и не отвлекаться на разбор OpenGL или DirectX.

Погнали. 
Идею построена на паттерне MVC, т.е. на разделении данных и их визуального отображения. 

Давайте рассмотрим основные классы и интерфейсы, их в моей схеме 3: 
Renderer - этот класс отвечает за весь рендер в целом, он хранит в себе список всех объектов, которые нужно отобразить в игре, знает порядок их отображения. Также он отвечает за различные действия с рендер конвеером, которые необходимо выполнить в начале каждого кадра и соответственно в конце. 
IEntity - этот интерфейс является базовым для всех объектов с данными, которые находятся в нашей игре. Каждая сущность имеет свой уникальный идентификатор. Одним словом  это model.
IRenderer - данный интерфейс является базовым для всех объектов рендера в игре. Он отвечает за визуализацию модели данных, т.е за визуализацию игровых сущностей. Это view.

Это все что касается основным типов данных нашей игре. Данный подход позволяет реализовать практически любой по сложности рендер, постепенно вырабатывая набор сущностей и способов их представления. 
Конечно при этом нужно будет дорабатывать и класс Renderer, добавляя в него новые возможности по настройке рендера.

Идем дальше, следующий шаг это создание стартового приложения и настройки вывода первого примитива. Пока без реализации схемы классов, только отрисовка одного примитива.

int _tmain(int argc, _TCHAR* argv[])
{
     /// блок инициализации окна
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
     glutInitWindowSize(800, 600);
     glutCreateWindow("Simple");
     /// устанавливаем различные калбек функции, которые будет вызывать glut
     glutDisplayFunc(renderScene);
     glutReshapeFunc(Reshape);
     glutKeyboardFunc(Keyboard);
     setupRC();
     // запускаем основной цикл приложения
     glutMainLoop();
     return 0;
}

Самый интересный для нас метод renderScene. Именно в него мы будем встраивать код по отрисовке. 
Сейчас он имеет следующий вид:

 void renderScene(void)
{
     //очищаем экран
     glClear(GL_COLOR_BUFFER_BIT);
     // устанавливаем матрицу для нашего объекта
     glPushMatrix();

     glTranslatef(-200.0f+pos, 0.0f, 0.0f);
     // отрисовываем квадрат красного цвета на экране.
     glColor3ub(255,0,0);
     glBegin(GL_QUADS);
         glVertex2f(200,400);
         glVertex2f(200,200);
         glVertex2f(400,200);
         glVertex2f(400,400);
     glEnd();

     glPopMatrix();
     // вызываем свап буфера для того, чтобы наша картинка появилась на кране монитора
     glutSwapBuffers();
     glutPostRedisplay();
}

На сегодня это все. В следующий раз я подробно пройдусь по интерфейсам, покажу реализацию класса Renderer. 
Весь код стартового приложения можно посмотреть здесь. Для использования glut нужно подключить статическую либу к проекту, а потом рядом с исполняемым файлом положить dll библиотеку. Все есть вот тут

Всем доброй ночи.

Комментариев нет:

Отправить комментарий