Академический Документы
Профессиональный Документы
Культура Документы
//---------------------------------------------------------------------------
//Инициализация
#include <vcl.h>
#include <GL/gl.h>
#include <GL/glu.h> // gl.h и glu.h содержат прототипы основных функций
OpenGL определённых в opengl32.dll и glu32.dll.
#pragma hdrstop
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_RGBA;// iPixelType – формат указания цвета -
цвет указывается четырьмя параметрами RGBA - красный, зленный, синий и альфа
ppfd->cColorBits = 16; // cColorBits – глубина цвета
ppfd->cDepthBits = 16; // cDepthBits – размер буфера глубины (Z-Buffer)
ppfd->cAccumBits = 0;
ppfd->cStencilBits = 16; // cStencilBits – размер буфера трафарета
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
FormResize(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormResize(TObject *Sender)
{
glViewport(0, 0, Width, Height);// glViewport устанавливает область
вывода – область, в которую OpenGL будет выводить изображение.
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // glLoadIdentity заменяет текущую матрицу видового
преобразования на единичную (матрицу идентичности), т.е. просто сбрасывает
изменения.
glOrtho(-5, 5, -5, 5, 2, 12);// // glOrtho устанавливает режим
ортогонального (прямоугольного) проецирования.
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);// gluLookAt устанавливает параметры
камеры: первая тройка – её координаты, вторая – вектор направления, третья –
направление оси Y
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
gluDeleteQuadric(quadObj); // освободить память, занимаемую под nquadObj .
if(ghRC)
{
wglMakeCurrent(ghDC,0);// освободить контекст
wglDeleteContext(ghRC); // разрушить его
}
if(ghDC) ReleaseDC(Handle, ghDC);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TimerTimer(TObject *Sender)
{
Draw();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Draw()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// glClear сбрасывает значения всего перечисленного в качестве параметров
GLUquadricObj *quadObj;
quadObj = gluNewQuadric();
glStencilFunc(GL_ALWAYS, 2, 0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
gluCube();
// вращаем сцену
// glRotated(ф, x,y,z) – поворачивает систему координат на угол ф (в
градусах) против часовой стрелки вокруг вектора (x,y,z)
glRotated(3, 1,0,0);
glRotated(5, 0,1,0);
glRotated(7, 0,0,1);
SwapBuffers(ghDC); // вывести все на экран
}
//---------------------------------------------------------------------------
GLvoid __fastcall TMainForm::gluCube( ) // Рисование куба
{
glBegin(GL_QUADS); // Начинаем рисовать четырехугольники
// Передняя сторона
glColorMaterial(1,1);
glColor3d(0.98,1,0.07);
glNormal3f( 0.0f, 0.0f, 1.0f); // Нормаль вперед
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // Низ лево на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // Низ право на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // Верх право на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // Верх лево на текстуре и
четырехугольнике
// Задняя сторона
glNormal3f( 0.0f, 0.0f,-1.0f); // Обратная нормаль
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // Низ право на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // Верх право на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // Верх лево на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // Низ лево на текстуре и
четырехугольнике
// Верхняя грань
glNormal3f( 0.0f, 1.0f, 0.0f); // Нормаль вверх
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // Верх лево на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // Низ лево на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // Низ право на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // Верх право на текстуре и
четырехугольнике
// Нижняя грань
glNormal3f( 0.0f,-1.0f, 0.0f); // Нормаль направлена вниз
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // Верх право на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // Верх лево на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // Низ лево на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // Низ право на текстуре и
четырехугольнике
// Правая грань
glNormal3f( 1.0f, 0.0f, 0.0f); // Нормаль направлена вправо
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // Низ право на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // Верх право на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // Верх лево на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // Низ лево на текстуре и
четырехугольнике
// Левая грань
glNormal3f(-1.0f, 0.0f, 0.0f); // Нормаль направлена влево
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // Низ лево на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // Низ право на текстуре и
четырехугольнике
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право на текстуре и
четырехугольнике
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // Верх лево на текстуре и
четырехугольнике
glEnd(); // Заканчиваем рисование
четырехугольников
}
//---------------------------------------------------------------------------