Array ( )
Вход:




Главная | OpenGL | GLSL | AI | Сеть | Примеры | Библиотека

OpenGL: Рисование примитивов






В этом уроке мы тоже не будем углублятся глубоко: рассмотрим только рисование примитивов,
таких, как треугольники, квадраты и линии.

За основу возьмём код прошлого урока (инициализация), немного изменив его.

В файл main.h добавим новую структуру - CVertex3. Буква "C" в начале означает,
что это класс либо структура. "3" в конце означает, что в этой структуре 3 координаты, т.к. позже
нам понадобятся и вершины с двумя координатами.
Итак, в файл main.h после обьявления extern`ов добавьте:

struc CVertex3{
    float x,y,z;
};


С этим файлом всё. Переходим к main.cpp
Сначала мы обьявим несколько вершин CVertex3 - это будут вершины, составляющие наши фигуры.
Потом перейдем в функцию RenderScene(), и всё остальное будем делать в ней.

Итак, в файле main.cpp после строки "#include main.h" добавьте:

#include "main.h"

// Вершины квадрата
CVertex3 QPoint1, QPoint2, QPoint3, QPoint4;
// Вершины линии
CVertex3 LPoint1, LPoint2;
// Вершины треугольника
CVertex3 TPoint1, TPoint2, TPoint3;


Далее идем к функции Init(). Она всё инициализирует, пусть заодно и о переменных позаботится =)
void Init(HWND hWnd)
{
    g_hWnd = hWnd;
    GetClientRect(g_hWnd, &g_rRect);
    InitializeOpenGL(g_rRect.right, g_rRect.bottom);

    // Инициализируем наши координаты
    // Квадрат:
    QPoint1.x = -1; QPoint1.y=0; QPoint1.z=0;
    QPoint2.x = 0;  QPoint2.y=0; QPoint2.z=0;
    QPoint3.x = 0;  QPoint3.y=1; QPoint3.z=0;
    QPoint4.x = -1; QPoint4.y=1; QPoint4.z=0;

    // Треугольник
    TPoint1.x = 0; TPoint1.y = -1; TPoint1.z=0;
    TPoint2.x = 1; TPoint2.y = -1; TPoint2.z=0;
    TPoint3.x = 1; TPoint3.y = 0; TPoint3.z=0;

    // Линия
    LPoint1.x = -1; LPoint1.y = -1; LPoint1.z=0;
    LPoint2.x = 1; LPoint2.y = 1; LPoint2.z = 0;
}


Теперь у нас есть координаты вершин для наших фигур, остаётся только
передать их OpenGL в нужном порядке. Сделаем это в функции RenderScene()
void RenderScene()
{
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    // Эта функция перемещает обьект, следующий за её вызовом на (X,Y,Z).
    // То есть после вызова glTranslateF все рисуемые обьекты будут перемещены.
    glTranslatef(0.0f,0.f,-5.0f);

    // Рисуем квадрат. Заметьте, мы рисуем его против часовой стрелки.
    // Запоминайте порядок рисования вершин и не путайте его, он будет нужен вам
    // при использовании нормалей и др.
    glBegin(GL_QUADS);
        glVertex3f(QPoint1.x, QPoint1.y, QPoint1.z);    // Нижний левый угол
        glVertex3f(QPoint2.x, QPoint2.y, QPoint2.z);    // Нижний правый
        glVertex3f(QPoint3.x, QPoint3.y, QPoint3.z);    // Верхний правый
        glVertex3f(QPoint4.x, QPoint4.y, QPoint4.z);    // Верхний левый
    glEnd();

    // Рисуем треугольник
    glBegin(GL_TRIANGLES);
        glVertex3f(TPoint1.x, TPoint1.y, TPoint1.z);
        glVertex3f(TPoint2.x, TPoint2.y, TPoint2.z);
        glVertex3f(TPoint3.x, TPoint3.y, TPoint3.z);
    glEnd();

    glBegin(GL_LINES);
        glVertex3f(LPoint1.x, LPoint1.y, LPoint1.z);
        glVertex3f(LPoint2.x, LPoint2.y, LPoint2.z);
    glEnd();
 
    SwapBuffers(g_hDC);
}


Вот и всё, и если сейчас вы скомпилируете сцену - увидите квадрат с треугольником
по диагонали, и линию между ними. Просто, не так ли? =)





Исходные коды к уроку




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

Войдите, чтобы оставить комментарий:












Яндекс.Метрика
 Яндекс цитирования.