Opengl 2d/3d

18.10.2010
4
0
#1
В общем вот код(не мой):

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 );
В общем поясните различие в рисование на плоскости и в пространстве.

Добавлено: Если можно переделайте этот код в рисование треугольника на плоскости, а дальше я сам разберусь, что и как делается
 
18.10.2010
4
0
#2
Или если этот код совершенно не подходит для рисование на плоскости, то дайте полный пример от начала до конца не от glBegin и до glEnd а целиком с подключением библиотеки, установкой контекста и рисованием.. я не могу ни как понять как на плоскости нарисовать..
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#3
Добрый день!
А вы могли бы задать вопросы более точно!
Или вы просто думаете изучить работу с OpenGL на C/C++, и нам стоит написать основные гайды по работе с OpenGL на Visual C++/Borland(Embarcadero) C++ Builder.
Просто пошаговый мануал и разбор функциональности в стиле гайда возможно принесет больше плодов.
Конечно если вы действительно начинающий в этой области.
 

PetrovVA

New Member
06.11.2013
4
0
#4
Или если этот код совершенно не подходит для рисование на плоскости, то дайте полный пример от начала до конца не от glBegin и до glEnd а целиком с подключением библиотеки, установкой контекста и рисованием.. я не могу ни как понять как на плоскости нарисовать..
Если вы действительно хотите изучать OpenGL, то обратитесь к урокам по OpenGL от NeHe (оригиналы и коды на NeHe Productions). Если вы работаете в среде Visual C++ MS VS 2010/2012 pro, то посмотрите
общий проект для всех этих уроков, демо и коды в исходных файлах.