Opanowałem jako takie podstawy OpenGL'a używają FreeGLUT'a. Jednak ostatnio naszedł mnie taki kaprys by OGL'a użyć z interfejsem Qt. Z dokumentacji wyczytałem, że obiekt OGL możemy zrobić jako normalnego widget'a (dziedzicząc z QGLWidget) i zwyczajnie wrzucić na formę. Na początek chciałem zrobić sobie najzwyczajniejszy trójkąt i kwadrat. Kod na pierwszy rzut oka wydaje się dość długi jak na forum jednak po prawdzie żadnej filozofii tu nie ma:
qgl_firstSteps.h
//--------------------
//--Klasa widget'u--
//---------------------
class CGLwidget : public QGLWidget
{
Q_OBJECT
public:
CGLwidget(QWidget *parent = 0);
~CGLwidget();
QSize minimumSizeHint() const;
QSize sizeHint() const;
protected:
void initializeGL();
void paintGl();
void resizeGL(int width, int height);
};
//---------------------
//----Klasa okna-------
//---------------------
class CWindow: public QWidget
{
Q_OBJECT
public:
CWindow();
~CWindow();
private:
CGLwidget *glScene;
};
qgl_fristSteps.cpp
CGLwidget::CGLwidget(QWidget *parent)
: QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
}
CGLwidget::~CGLwidget()
{
}
//**********
void CGLwidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f); // ustawienie bufora głebi
glEnable(GL_DEPTH_TEST); // włączenie testowania głębi
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
//************
void CGLwidget::paintGl()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES); // Rysujemy trójkąty
glVertex3f( 0.0f, 1.0f, 0.0f); // Góra
glVertex3f(-1.0f,-1.0f, 0.0f); // Lewy
glVertex3f( 1.0f,-1.0f, 0.0f); // Prawy
glEnd(); // Koniec rysowania trójkąta
glTranslatef(3.0f,0.0f,0.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f,1.0f,0.0f);//gorny lewy
glVertex3f(-1.0f,-1.0f,0.0f);//dolny lewy
glVertex3f(1.0f,-1.0f,0.0f);//dolny prawy
glVertex3f(1.0f,1.0f,0.0f);//gorny prawy
glEnd();
}
//***********
void CGLwidget::resizeGL(int width, int height)
{
}
QSize CGLwidget::minimumSizeHint() const
{
return QSize(50, 50);
}
QSize CGLwidget::sizeHint() const
{
return QSize(400, 400);
}
//----------------
//---Klasa okna---
//----------------
CWindow::CWindow()
{
glScene=new CGLwidget;
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(glScene);
setLayout(mainLayout);
}
//*******
CWindow::~CWindow()
{
}
Wszystko się kompiluje, uruchamia się bez problemu ale rezultat jest taki: http://img299.imageshack.us/img299/3431/qglresult.jpg
I teraz pytanie, czego nie uwzględniłem?
//q: nie pisze posta, bo nie wiem i ni epomoge, ale az mi sie cisnie na usta: wow. sliczne. zupelnie jakby framebuffer sie zrąbał.. ale inne formaty pikseli to by wyszly horyzontalne paski a nie prostokatne regiony.. jak niska warstwa moglaby inaczej kopiowanie skopac?