Opengl 2d/3d

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Andersen1313, 11 окт 2013.

  1. Andersen1313

    Andersen1313 New Member

    Регистрация:
    18 окт 2010
    Сообщения:
    4
    Симпатии:
    0
    В общем вот код(не мой):

    Код (C++):
    //---------------------------------------------------------------------------

    #include <vcl.h>

    #include <GL/gl.h>
    #include <GL/glu.h>
    //#include <GL/glaux.h>
    #pragma hdrstop

    #include "UMain.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }

    BOOL bSetupPixelFormat(HDC hdc)
    {
    PIXELFORMATDESCRIPTOR pfd, *ppfd;
    int pixelformat;

    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;
    ppfd->cColorBits = 16;
    ppfd->cDepthBits = 16;

    ppfd->cAccumBits = 0;
    ppfd->cStencilBits = 0;

    if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
    {
    MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
    return FALSE;
    }
    if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
    {
    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, 255.0, 255.0, 255.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::FormClose(TObject *Sender, TCloseAction &Action)
    {
    if(ghRC) {
    wglMakeCurrent(ghDC,0);
    wglDeleteContext(ghRC);
    }
    if(ghDC) {
    ReleaseDC(Handle, ghDC);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Draw();
    }
    //---------------------------------------------------------------------------
    void TForm1::Draw()
    {
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    GLUquadricObj *quadObj;
    quadObj = gluNewQuadric();

    gluQuadricDrawStyle(quadObj, GLU_FILL);
    glColor3f(1,0,0);
    gluSphere(quadObj, 3,20,20);
    glRotatef(3, 0,1,0);
    gluDeleteQuadric(quadObj);

    SwapBuffers(ghDC);
    }
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
    Form1->ClientWidth = Form1->ClientHeight;
    glViewport( 0, 0, Form1->ClientWidth, Form1->ClientHeight); //Определяем размеры области рисование
    glMatrixMode( GL_PROJECTION ); //??? Определение типа матрицы
    glLoadIdentity();
    glOrtho(-5,5, -5,5, -12,12);
    gluLookAt(0,0,5, 0,0,0, 0,1,0);
    glMatrixMode( GL_MODELVIEW );
    }
    //---------------------------------------------------------------------------
    Этот пример реализует рисование 3d сферы.

    Ни как не могу разобраться, какие функции отвечают за задание 2d и 3d надо ли вообще что то менять в функциях перед тем как рисовать в Draw() на плоскости или нет.

    Прочитал справку, но не могу понять, что задает функция glMatrixMode().

    И как я понимаю если что то и надо предварительно менять перед рисованием не в пространстве, а на плоскости, то это надо делать или в этих функциях:

    Код (C++):
    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);
    или в этих функциях:

    Код (C++):
    glMatrixMode( GL_PROJECTION ); //??? Определение типа матрицы
    glLoadIdentity();
    glOrtho(-5,5, -5,5, -12,12);
    gluLookAt(0,0,5, 0,0,0, 0,1,0);
    glMatrixMode( GL_MODELVIEW );
    В общем поясните различие в рисование на плоскости и в пространстве.

    Добавлено: Если можно переделайте этот код в рисование треугольника на плоскости, а дальше я сам разберусь, что и как делается
     
  2. Andersen1313

    Andersen1313 New Member

    Регистрация:
    18 окт 2010
    Сообщения:
    4
    Симпатии:
    0
    Или если этот код совершенно не подходит для рисование на плоскости, то дайте полный пример от начала до конца не от glBegin и до glEnd а целиком с подключением библиотеки, установкой контекста и рисованием.. я не могу ни как понять как на плоскости нарисовать..
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Добрый день!
    А вы могли бы задать вопросы более точно!
    Или вы просто думаете изучить работу с OpenGL на C/C++, и нам стоит написать основные гайды по работе с OpenGL на Visual C++/Borland(Embarcadero) C++ Builder.
    Просто пошаговый мануал и разбор функциональности в стиле гайда возможно принесет больше плодов.
    Конечно если вы действительно начинающий в этой области.
     
  4. PetrovVA

    PetrovVA New Member

    Регистрация:
    6 ноя 2013
    Сообщения:
    4
    Симпатии:
    0
    Если вы действительно хотите изучать OpenGL, то обратитесь к урокам по OpenGL от NeHe (оригиналы и коды на NeHe Productions). Если вы работаете в среде Visual C++ MS VS 2010/2012 pro, то посмотрите
    общий проект для всех этих уроков, демо и коды в исходных файлах.
     
Загрузка...

Поделиться этой страницей