Anda di halaman 1dari 9

TUGAS PRAKTIKUM 5

GKV LAB A2

‘Tekstur di OpenGL dan Realisasinya di Kubus’

NATASHA PUTRI

24060119130073

Asisten Praktikum :

Muhammad Rizqi Arya Pradana - Hanifah Gladis Amalia

DEPARTEMEN ILMU KOMPUTER / INFORMATIKA

FAKULTAS SAINS DAN MATEMATIKA

UNIVERSITAS DIPONEGORO

2021
PEMBAHASAN PERTANYAAN KUBUS

Pertanyaan :

Tekstur apa saja yang dibuat oleh kubus tersebut!

Jawab :

Kubus ini menggunakan tekstur gambar, untuk menempelkan gambar sebagai tekstur
padasisi kubus memanfaatkan procedure Gluint loadTexture(Image*image). Untukmenempelkan
tekstur warna pada sisi kubus menggunakan tekstur Solid Color, selain itutekstur gradient
digunakan untuk membuat gradasi atau perpaduan warna. Terdapat beberapa fungsi yang
dimanfaatkan untuk membuat tekstur kubus tersebut, antara lain:

glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D,
_textureIdAtas);glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_LINEAR);
PEMBAHASAN SOURCE CODE KUBUS PRISON REALM

Untuk membuat tekstur di butuhkan beberapa kelas dasar yang di gunakan untuk membaca
gambar yang akan di gunakan sebagai teksturnya
1. imageLoader.cpp untuk membaca gambarnya
2. imageLoad.h merupakan class gambar
3. main untuk program kubus yang akan kita buat
Sebelum membuat prosedur dan fungsinya, pertama yang perlu dilakukan adalah
mendefinisikan variabel – variabel yang akan digunakan dalam pembuatan objek
kubus ini, yaitu sebagai berikut :

1. Dalam main.cpp ada variabel BOX_SIZE merupakan panjang setiap sisi kubus.
2. Float_angle untuk rotasi terhadap box

const float BOX_SIZE = 7.0f;


float _angle = 0;
GLuint _textureId;

3. Implementasi Tekstur
Lalu untuk mengambil gambar, panggil fungsi yang ada di imageloader. Saat kita
mengambil gambar, kita bermain dengan tekstur, jadi kita harus menambahkan 'GLuint
loadTexture'. Seperti code sebagai berikut :

GLuint loadTexture(Image* image) {


GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image-
>width, image->height, 0, GL_RGB, GL_UNSIGNED_BYTE,
image->pixels);
return textureId;
}

a. GLuint texture[1]; merupakan ID untuk tekstur yg dipakai


b. GlGenTextures digunakan untuk generate teksture
c. GlBind untuk memasang tekstur pada objek 2d
d. glTextImage2D mengatur besar gambar dan format warna
4. Insert Gambar
Untuk menampilkan gambar harus melakukan rendering terlebih dahulu. Dan
jangan lupa menambahkan fungsi tambahan saat rendering agar hasilnya lebih menarik.
Panggil fungsi tersebut di fungsi initRendering

void initRendering() {
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
Image* image = loadBMP(“prison.bmp”);
_textureId = loadTexture(image);
delete image;
}

Gambar diload menggunakan function dari class (loadBMP) format nama gambar harus
persis dengan yang format nama file dan formatnya harus bmp (bitmap). Lalu objek
image di masukan dalam fungsi loadTexture. Di sini saya membuat ke enam sisi dengan
gambar yang sama sehingga saya hanya load 1 gambar.
5. Draw Scene Detail Method  Membuat sisi kubus

a. glVertex3f(x, y, z)

merupakan fungsi untuk mengatur koordinat dari vertex (simpul). Fungsi


glVertex3f dipanggil di dalam pasangan glBegin dan glEnd. Fungsi glVertex3f
memiliki 3 parameter yang akan menentukan koordinat dari titik – titik
pembentuk garis. Berikut parameternya : glVertex3f(x, y, z), di mana

a. x : menentukan posisi absis dari titik,


b. y : menentukan posisi ordinat dari titik,

c. z : menentukan posisi koordinat z dari titik.

d. glTexCoord2f() digunakan untuk menspesifikasi koordinat tekstur.

Karena bagian code terlalu banyak, code untuk prosedur Truk dapat
dilihat pada source code awal. Penulis sudah menuliskan keterangan –
keterangan yang dibutuhkan di dalamnya.
glTexCoord2f(0.0f, 0.0f);
glNormal3f(0.0, 1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);

6. Fungsi draw Scene rotasi putar


Fungsi ini digunakan untuk menggambar kubus yang dibuat dan akan diputar
pada kode rotatenya dengan parameter _angle yang akan bertambah nilainya dari 0 – 360
lalu kembali lagi ke 0 setiap 25 ms. Seperti source code sebagai berikut :

//Panggil setiap 25ms


void update(int value) {
_angle += 1.0f;
if (_angle > 360) {
_angle -= 360;
}
glutPostRedisplay();
glutTimerFunc(25, update, 0);

Full Source Code dari Kubus BerTesktur “Prison Realm” :

/* Penulis : Natasha Putri / 24060119130073


Program : Main.cpp
*/

#include <iostream>
#include <stdlib.h>

#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include "imageloader.h"

using namespace std;

const float BOX_SIZE = 7.0f; //Panjang tiap sisi kubus


float _angle = 0; //Rotasi terhadap box
GLuint _textureId; //ID OpenGL untuk tekstur

void handleKeypress(unsigned char key, int x, int y) {


switch (key) {
case 27: //Tekan Escape untuk EXIT
exit(0);
}
}

//Membuat gambar menjadi tekstur kemudian berikan ID pada tekstur


GLuint loadTexture(Image* image) {
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height, 0,
GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
return textureId;
}
void initRendering() {
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);

Image* image = loadBMP("prison.bmp");


_textureId = loadTexture(image);
delete image;
}

void handleResize(int w, int h) {


glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);
}

void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.0f, 0.0f, -20.0f);

GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};


glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};


GLfloat lightPos[] = {-2 * BOX_SIZE, BOX_SIZE, 4 * BOX_SIZE, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

glRotatef(-_angle, 1.0f, 1.0f, 0.0f);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
//glBegin(GL_QUADS);

//Sisi atas
glTexCoord2f(0.0f, 0.0f);
glNormal3f(0.0, 1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);

//Sisi bawah
glTexCoord2f(0.0f, 0.0f);
glNormal3f(0.0, -1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);

//Sisi kiri
glNormal3f(-1.0, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);

//Sisi kanan
glNormal3f(1.0, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);

//glEnd();

//Sisi depan
glNormal3f(0.0, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, BOX_SIZE / 2);

//Sisi belakang
glNormal3f(0.0, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, BOX_SIZE / 2, -BOX_SIZE / 2);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -BOX_SIZE / 2);

glEnd();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}

//Panggil setiap 25ms


void update(int value) {
_angle += 1.0f;
if (_angle > 360) {
_angle -= 360;
}
glutPostRedisplay();
glutTimerFunc(25, update, 0);
}

int main(int argc, char** argv) {


glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600, 600);

glutCreateWindow("Prison Realm");
initRendering();

glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
glutTimerFunc(25, update, 0);

glutMainLoop();
return 0;
}

Hasil Screenshot :

Anda mungkin juga menyukai