OpenGL инициализация c++ builder 6 на Windows 10
Вращающаяся сфера
исходник и исполняемый файл здесь
=
=
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnIdle = IdleLoop;
}
//----------ДЛЯ ВЫВОДА ИСПОЛЬЗУЕМ МЕТОД TForm1::IdleLoop(TObject*, bool& done) НАЗНАЧЕНЫЙ СОБЫТИЮ OnIdle ПЕРЕМЕННОЙ -Application СОБЫТИЕ ПРОИСХОДИТ ПРИ ПРОСТОЕ ПРИЛОЖЕНИЯ----------------------------------------------------------------
void __fastcall TForm1::IdleLoop(TObject*, bool& done)
{
done = false; //СОБЫТИЕ ВЫЗЫВАЕТСЯ БЕСКОНЕЧНО ПОКА FALSE
Draw();
}
//---------------------------------------------------------------------------
BOOL __fastcall TForm1::bSetupPixelFormat(HDC hdc)
{
// заполняем структуру формата пикселей
PIXELFORMATDESCRIPTOR pfd, *ppfd; // объявляем объект с именем pfd и указатель на объект ppfd
int pixelformat;
ppfd = &pfd; // указателю на объект присваиваем адрес объектя &-операция взятия адреса
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); //размер структуры
ppfd->nVersion = 1; // в сегда 1
//устанавливаем флаги
// PFD_DRAW_TO_WINDOW выводим графику в окно
// PFD_SUPPORT_OPENGL буфер кадра поддерживает вывод через OpenGL
// PFD_DOUBLEBUFFER испоьзуем два буфера (Back и Front)
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE; //главный слой рисования
ppfd->iPixelType = PFD_TYPE_RGBA; //формат указания цвета PFD_TYPE_RGBA-цвет указываетя четырьмя параметрами RGBA красный зеленый синий альфа PFD_TYPE_COLORINDEX- цвет указывается индексом в палитре
ppfd->cColorBits = 16; //глубина цвет здесь 16 или 32
ppfd->cDepthBits = 16; //размер буфера глубены (Z-Buffer)
ppfd->cAccumBits = 0; //нет буфера накопления
ppfd->cStencilBits = 0; //размер буфера трафорета
if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0) //Функция ChoosePixelFormat подбирает формат пикселей, максимально удовлетворяющий нашим требованиям, и возвращает его дескриптор
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error",
MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE) // а SetPixelFormat устанавливает его в контексте устройства (dc).
{
MessageBox(NULL, "SetPixelFormat failed", "Error",
MB_OK);
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle); // дискриптор окна у нас форма
if (!bSetupPixelFormat(ghDC)) // устанавливаем формат пикселей для этого окна
Close();
ghRC = wglCreateContext(ghDC); //создаем контекст воспроизведения
wglMakeCurrent(ghDC, ghRC); // контекст воспроизведения делаем текущем
glClearColor(0.0, 0.0, 0.0, 0.0); // очищаем контекст воспроизведения черный цвет
FormResize(Sender); // метод перерисовки формы
glEnable(GL_COLOR_MATERIAL); // разрешили цвет
glEnable(GL_DEPTH_TEST); // разрешили объем
glEnable(GL_LIGHTING); // разрешили освещение
glEnable(GL_LIGHT0); // включили лампочку
float p[4]={3,3,3,1}, //параметры положение источника света в однородных мировых координатах
d[3]={-1,-1,-3}; //параметры направление источника света в днородных мировых координатах
glLightfv(GL_LIGHT0,GL_POSITION,p); // положение источника света в однородных мировых координатах
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d); //направление источника света в днородных мировых координатах
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
glViewport( 0, 0, Width, Height ); //устанавливает область вывода изображения на форме
glMatrixMode( GL_PROJECTION ); // устанавливает режим матрици видового преобразования
glLoadIdentity(); // заменяеи ткущию матрицу видового преобразования на еденичную сброс изменений
glOrtho(-5,5, -5,5, 2,12);// устанавливает режим ортогонального (прямоугольного) проецирования.
gluLookAt(0,0,5, 0,0,0, 0,1,0); // устанавливает параметры камеры: первая тройка – её координаты, вторая – вектор направления, третья – направление оси Y.
glMatrixMode( GL_MODELVIEW ); //
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ghRC)
{
wglMakeCurrent(ghDC,0); //освобождаем ресурсы
wglDeleteContext(ghRC);// удоляем дискриптор воспроизведения
}
if(ghDC)
ReleaseDC(Handle, ghDC);//удаляем дискриптор окна
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //очищаем буфер цвета и буфер глубины
GLUquadricObj *quadObj;// объявляем указатель на объект
quadObj=gluNewQuadric(); // создаем объект и выдиляем память
gluQuadricDrawStyle(quadObj, GLU_FILL);// стиль объекта GLU_FILL– рисуется сплошной объект, GLU_LINE – каркасный (проволочный) объект, GLU_POINT – рисуются только точки.
glColor3f(1,0.3,0.7);// устанавливает цвет фигуры
gluSphere(quadObj, 2,10,10);//делаем из объекта сферу радиус-2, количество разбиений вдоль-10 и поперек-10
// gluCylinder(quadObj, 1.0, 1.0, 2.0, 15, 15);//цилиндр радиус низ-1, радиус верх-1, высота-2, количество разбиений вдоль-15 и поперек-15
// gluDisk(quadObj, 0.5, 1.0, 12, 12);// диск радиус внутрений-0.5, радиус внешний-1, количество разбиений вдоль-12 и поперек-12
// gluPartialDisk(quadObj, 0.5, 1.0, 15, 12, 0.0, 160.0);//сектор диска радиус внутрений-0.5, радиус внешний-1, количество разбиений вдоль-12 и поперек-12, угол начало 0, угол коней 160 в град
glRotatef(3, 0,1,0); // вращение объекта
gluDeleteQuadric(quadObj); // освобождаем память выделенную объекту
SwapBuffers(ghDC); // выводим изображение на форму
}
//------------ДЛЯ ВЫВОДА ИСПОЛЬЗУЕМ ТАЙМЕР------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// Draw();
}
//---------------------------------------------------------------------------
=
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TTimer *Timer1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall Timer1Timer(TObject *Sender);
private: // User declarations
public: // User declarations
HGLRC ghRC; // указатель на контекст воспроизведения
HDC ghDC; // дискриптор окна у нас форма
void __fastcall Draw(void);
void __fastcall IdleLoop(TObject*, bool&);
BOOL __fastcall bSetupPixelFormat(HDC hdc);
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
=
=
|