OpenGL: Nampilin Gambar

Belakangan ini gw lagi doyan ngutak atik OpenGL. Buat ngodingnya sih gw pake IDE Nokia Qt Creator, IDE tercinta gw setelah Dev-C++ buat ngoding pake C++. Qt Creator ini bisa dibilang satu-satunya IDE yang beneran gw pake buat bikin aplikasi yang rada serius pake C++, berhubung Dev-C++ itu rada-rada jadul & nggak banyak ngasih bantuan ke programmernya. Malahan gw pernah liat di forum programmer luar negeri ada programmer yang ngamuk-ngamuk nyuruh orang lain semuanya berenti pake Dev-C++ saking bencinya dia sama ini IDE. Oke, sekarang gw gak lagi ngebahas IDE lah ya. Lagian yang gw pake Qt Creator, bukan Dev-C++.

Sebenernya sih gw mau bikin model 3D world, tapi gw ada sedikit masalah dengan class QGLWidget di Qt. Camera view yang dikeluarin sama widget OpenGL gw bentuknya selalu bujur sangkar nggak peduli berapa panjang & lebar (plus kedalaman) view kamera yang gw set waktu pertama bikin widgetnya. Jadilah gambar Led Zeppelin ini bentuknya bujur sangkar pas ditampilin. Padahal aslinya ini gambar lumayan lebar & bidang yang gw pake buat ngegambarnya juga lebar.

Harusnya sih nggak begini...

Menurut dosen gw sih itu bisa dibikin stretched, tapi gw belum lanjut lagi ngerjainnya. Sekarang mungkin bagusnya gw bikin tutorial cara ngemunculin gambar kayak begitu dulu, berhubung kayaknya orang-orang yang baru mulai mainin OpenGL bakal bingung gimana caranya buat nampilin gambar. Widget OpenGL buat nampilin gambar di situ gw bikin inheritance dari class QGLWidget, bentuk classnya begini.

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QtOpenGL/QGLWidget>

class GLWidget: public QGLWidget {
    Q_OBJECT

public:
    GLWidget(QWidget *parent = NULL);
    ~GLWidget();

protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
};

#endif // GLWIDGET_H

Gw nyontoh model class GLWidget yang ada di folder examples di Qt, dengan sedikit perubahan. Gw lupa tepatnya contoh yang mana yang gw jadiin patokan sih, pokoknya yang kalo aplikasinya dijalanin ngeluarin gambar logo Qt dalam bentuk 3D deh. Untuk implementasi initializeGL(), gw cuma masukin 3 baris perintah aja.

void GLWidget::initializeGL() {
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
}

Untuk resizeGL(), gw ngeset posisi kameranya.

void GLWidget::resizeGL(int width, int height)
{
    int side = qMin(width, height);
    glViewport((width - side) / 2, (height - side) / 2, side, side);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
#ifdef QT_OPENGL_ES_1
    glOrthof(-20, +20, -15, +15, 0.0, 15.0);
#else
    glOrtho(-20, +20, -15, +15, 0.0, 15.0);
#endif
    glMatrixMode(GL_MODELVIEW);
}

Lalu untuk paintGL(), di sini gw ngegambar bidangnya & sekalian masang gambar yang gw mau di bidang yang gw gambar. Gw pake QPixMap buat masang gambarnya.

void GLWidget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    GLuint ledZeppelin = bindTexture(QPixmap(QString(":/images/zeppelin.jpg")), GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, ledZeppelin);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-20.0f, -15.0f, -0.1f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-20.0f, 15.0f, -0.1f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(20.0f, 15.0f, -0.1f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(20.0f, -15.0f, -0.1f);
    glEnd();
}

Btw, buat yang belum ngerti, glBegin(GL_QUADS) itu buat penanda kalo gw mau ngegambar segiempat & glVertex3f() itu dipake buat naruh posisi-posisi titik sudut segiempatnya. Gw taroh titik sudutnya ngepas dengan batas camera view yang diset pake function glOrtho() di resizeGL() tadi. Function glTexCoord2f() berfungsi buat matok posisi ujung gambar yang dipake buat teksturnya di vertex yang dibuat sesudah function glTexCoord2f() itu dipanggil.

Kalo posisinya udah bener, gambar yang mau kita pasang bakal jadi tekstur buat bidang yang kita gambar & bakal ditampilin pas ke kamera kayak di screenshot tadi.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s