Воскресенье, 12.05.2024, 02:56
Главная Регистрация RSS
Приветствую Вас, Гость
Меню сайта
Категории раздела
Форма входа
ДРУЗЬЯ САЙТА

Вызвать мастера в Красноярске

8 983 207 5474

8 902 918 9334

8 933 332 3164

---------------------------------

Запчасти бытткхники

  • Велес т.2935600
  • СЦ Близнецов т.2296595
  • Вираж
  • Красраб 110 т.2589503
  • Комплекстур Щорса30 т.2606797
  • Радиодетали

  • Якорный 9 т.2688317
  • Воронова 16 т.2202990
  • Красраб 125а т.2456544
  • Профи т.2702737
  • Дайте две т.+79237713323
  • Электрика

  • Электро +
  • Планета электрика
  • ЗАКЛАДКИ
    Поиск
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Главная » Статьи » C++ Builder » OpenGL

    OpenGL инициализация c++ builder 6 на Windows 10

    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

     

    =

    =

    Категория: OpenGL | Добавил: doka (21.08.2020)
    Просмотров: 504 | Рейтинг: 0.0/0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]