ALIASING
Efek pada computer grafis bila representasi kontinu pada obyek yang memiliki resolusi tak
terbatas ditampilkan pada layar dengan memperkirakan posisinya pada resolusi terbatas
Contoh :
SOLUSI : MIPMAPPING
Denganmenghitungterlebihdahulupenampakanteksturnyapadavariasijarakyang ditentukan
MIPMAPPING :
MIPMAPPING
Setiapmipmapmewakilisebuahlevel kedalaman(level of depth / LOD)
Biasanyaberukuranpangkat2 : 4x4, 8x8, 16x16, 32x32, 64x64, …
Setelahditerapkanmipmapmakahasilnyasemakinbagus
Contoh :
FILTERING
Biasanya digunakan bersamaan dengan mipmapping
Dengan mengambil rata-rata dari beberapa texel untuk mendapatkan nilai final dari RGB nya
FILTER BILINEAR
Mengambil rata-rata dari 4 texel bertetanggaan dengan bobot
Sederhana, komputasi ringan, dan mengeliminasi beberapa aliasing
Tidak membantu dalam memperjelas LOD
FILTER TRILINEAR
Menginterpolasi antara 2 LOD
Final nilai RGB yaitu nilai antara hasil bilinear pada LOD pertama dan bilinear pada LOD
kedua, Mengeliminasi lipatan antar LOD, Komputasi 2x lebih berat dari bilinear
ANISOTROPIC FILTER
Mengganggap piksel pada layar dipetakan ke area kotak (isotropic) atau trapezium dari texel
Menggunakan bilinear atau trilinear setelah bentuk filter ditentukan
Kompleks tapi menghasilkan hasil yang bagus
Contoh Bilinear :
Contoh Trilinear :
Contoh Anisotropic :
Trilinear VS Anisotropic
Contoh :
MAGNIFICATION & MINIFICATION
•Minification: bila lebih dari satu texel dapat melingkupi satu pixel
•Magnification : bila lebih dari satu piksel dapat melingkupi satu texel
Contoh :
MULTI SAMPLING
Melakuk ananti aliasing pada seluruh layar tidak hanya pada obyek
Setiap piksel pada frame buffer mempunyai beberapa sampel
Hasil warna akhir pada piksel yaitu kombinasi semua sampel pada piksel
Cara :
Contoh :
Contoh Penerapan Program Multi Sampling Anti Aliasing
// parameter untuk multi sampling anti aliasing
bool flagMSAA = false;
GLuint framebuffer;
// parameter vertex array object (VAO) untuk kubus
// parameter vertex buffer object (VBO) untuk kubus
GLuint cubeVAO, cubeVBO;
int screenWidth = 480; int screenHeight = 480; // ukuran layar
// buat tekstur dengan multi sample
GLuint generateMultiSampleTexture(GLuint samples)
{
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples,
GL_RGB, screenWidth, screenHeight, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
return texture;
}
// fungsi untuk menggambar obyek
void drawObject()
{
// obyek bisa dimasukkan diantara glPushMatrix() dan glPopMatrix()
// fungsinya agar obyek tidak terpengaruh atau mempengaruhi obyek lain
// saat diwarnai, ditransformasi dan sebagainya
glPushMatrix();
// operasi transformasi rotasi ke arah sumbu X (gunakan bila perlu)
glRotatef(objectAngle, objectPosX, objectPosY, objectPosZ);
// set warna obyek ke warna putih (1, 1, 1)
glColor3f(1.0f, 1.0f, 1.0f);
// menggambar obyek diawali glBegin(tipe obyek) dan diakhiri dengan glEnd()
// kecuali menggunakan fungsi seperti dibawah ini
float p = 1.0f;
GLfloat cubeVertices[] = {
// sisi belakang
-p, -p, -p,
p, -p, -p,
p, p, -p,
-p, p, -p,
// sisi depan
-p, -p, p,
p, -p, p,
p, p, p,
-p, p, p,
// sisi kiri
-p, p, p,
-p, p, -p,
-p, -p, -p,
-p, -p, p,
// sisi kanan
p, p, p,
p, p, -p,
p, -p, -p,
p, -p, p,
// sisi bawah
-p, -p, -p,
p, -p, -p,
p, -p, p,
-p, -p, p,
// sisi atas
-p, p, -p,
p, p, -p,
p, p, p,
-p, p, p
};
// buat VAO dan VBO untuk kubus
glGenVertexArrays(1, &cubeVAO);
glGenBuffers(1, &cubeVBO);
glBindVertexArray(cubeVAO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
// masukkan data vertex kubus diatas ke buffer
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertices), &cubeVertices,
GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat),
(GLvoid*)0);
glBindVertexArray(0);
// gambar data kubus
glBindVertexArray(cubeVAO);
glDrawArrays(GL_QUADS, 0, 24);
glBindVertexArray(0);
// blit multi-sample buffer ke default frame buffer
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight,
GL_COLOR_BUFFER_BIT, GL_NEAREST);
glPopMatrix();
}
// taruh semua obyek yang akan digambar di fungsi display()
void display()
{
// bersihkan layar dan buffer
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// posisikan kamera pandang
// dalam hal ini sumbu Y ada diatas dan posisi kamera pandang di (posX, posY,
posZ)
gluLookAt(posX, posY, posZ, posX + rotX, posY + rotY, posZ + rotZ, 0.0f, 1.0f,
0.0f);
// aktifkan / matikan MSAA
if (flagMSAA)
glDisable(GL_MULTISAMPLE);
else
glEnable(GL_MULTISAMPLE);
// panggil fungsi untuk menggambar obyek
drawObject();
// tampilkan obyek ke layar
// gunakan glFlush() bila memakai single buffer
// gunakan glutSwapBuffers() bila memakai double buffer
glutSwapBuffers();
}
Daftar Pustaka
Interactive Computer Graphics 6thEdition di :
Chapter 6 – Anti Aliasing di halaman 342-344.
Chapter 7 – Multi Sampling di halaman 410-411.
Chapter 7 – Sampling & Aliasing di halaman 413-421.
Pertemuan 07 Teksture Prosedural PDF
Praktikum 06
Efek pada computer grafis bila representasi kontinu pada obyek yang memiliki resolusi tak
terbatas ditampilkan pada layar dengan memperkirakan posisinya pada resolusi terbatas
Contoh :
SOLUSI : MIPMAPPING
Denganmenghitungterlebihdahulupenampakanteksturnyapadavariasijarakyang ditentukan
MIPMAPPING :
MIPMAPPING
Setiapmipmapmewakilisebuahlevel kedalaman(level of depth / LOD)
Biasanyaberukuranpangkat2 : 4x4, 8x8, 16x16, 32x32, 64x64, …
Setelahditerapkanmipmapmakahasilnyasemakinbagus
Contoh :
FILTERING
Biasanya digunakan bersamaan dengan mipmapping
Dengan mengambil rata-rata dari beberapa texel untuk mendapatkan nilai final dari RGB nya
FILTER BILINEAR
Mengambil rata-rata dari 4 texel bertetanggaan dengan bobot
Sederhana, komputasi ringan, dan mengeliminasi beberapa aliasing
Tidak membantu dalam memperjelas LOD
FILTER TRILINEAR
Menginterpolasi antara 2 LOD
Final nilai RGB yaitu nilai antara hasil bilinear pada LOD pertama dan bilinear pada LOD
kedua, Mengeliminasi lipatan antar LOD, Komputasi 2x lebih berat dari bilinear
ANISOTROPIC FILTER
Mengganggap piksel pada layar dipetakan ke area kotak (isotropic) atau trapezium dari texel
Menggunakan bilinear atau trilinear setelah bentuk filter ditentukan
Kompleks tapi menghasilkan hasil yang bagus
Contoh Bilinear :
Contoh Trilinear :
Contoh Anisotropic :
Trilinear VS Anisotropic
Contoh :
MAGNIFICATION & MINIFICATION
•Minification: bila lebih dari satu texel dapat melingkupi satu pixel
•Magnification : bila lebih dari satu piksel dapat melingkupi satu texel
Contoh :
MULTI SAMPLING
Melakuk ananti aliasing pada seluruh layar tidak hanya pada obyek
Setiap piksel pada frame buffer mempunyai beberapa sampel
Hasil warna akhir pada piksel yaitu kombinasi semua sampel pada piksel
Cara :
Contoh :
Contoh Penerapan Program Multi Sampling Anti Aliasing
// parameter untuk multi sampling anti aliasing
bool flagMSAA = false;
GLuint framebuffer;
// parameter vertex array object (VAO) untuk kubus
// parameter vertex buffer object (VBO) untuk kubus
GLuint cubeVAO, cubeVBO;
int screenWidth = 480; int screenHeight = 480; // ukuran layar
// buat tekstur dengan multi sample
GLuint generateMultiSampleTexture(GLuint samples)
{
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples,
GL_RGB, screenWidth, screenHeight, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
return texture;
}
// fungsi untuk menggambar obyek
void drawObject()
{
// obyek bisa dimasukkan diantara glPushMatrix() dan glPopMatrix()
// fungsinya agar obyek tidak terpengaruh atau mempengaruhi obyek lain
// saat diwarnai, ditransformasi dan sebagainya
glPushMatrix();
// operasi transformasi rotasi ke arah sumbu X (gunakan bila perlu)
glRotatef(objectAngle, objectPosX, objectPosY, objectPosZ);
// set warna obyek ke warna putih (1, 1, 1)
glColor3f(1.0f, 1.0f, 1.0f);
// menggambar obyek diawali glBegin(tipe obyek) dan diakhiri dengan glEnd()
// kecuali menggunakan fungsi seperti dibawah ini
float p = 1.0f;
GLfloat cubeVertices[] = {
// sisi belakang
-p, -p, -p,
p, -p, -p,
p, p, -p,
-p, p, -p,
// sisi depan
-p, -p, p,
p, -p, p,
p, p, p,
-p, p, p,
// sisi kiri
-p, p, p,
-p, p, -p,
-p, -p, -p,
-p, -p, p,
// sisi kanan
p, p, p,
p, p, -p,
p, -p, -p,
p, -p, p,
// sisi bawah
-p, -p, -p,
p, -p, -p,
p, -p, p,
-p, -p, p,
// sisi atas
-p, p, -p,
p, p, -p,
p, p, p,
-p, p, p
};
// buat VAO dan VBO untuk kubus
glGenVertexArrays(1, &cubeVAO);
glGenBuffers(1, &cubeVBO);
glBindVertexArray(cubeVAO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
// masukkan data vertex kubus diatas ke buffer
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertices), &cubeVertices,
GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat),
(GLvoid*)0);
glBindVertexArray(0);
// gambar data kubus
glBindVertexArray(cubeVAO);
glDrawArrays(GL_QUADS, 0, 24);
glBindVertexArray(0);
// blit multi-sample buffer ke default frame buffer
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight,
GL_COLOR_BUFFER_BIT, GL_NEAREST);
glPopMatrix();
}
// taruh semua obyek yang akan digambar di fungsi display()
void display()
{
// bersihkan layar dan buffer
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// posisikan kamera pandang
// dalam hal ini sumbu Y ada diatas dan posisi kamera pandang di (posX, posY,
posZ)
gluLookAt(posX, posY, posZ, posX + rotX, posY + rotY, posZ + rotZ, 0.0f, 1.0f,
0.0f);
// aktifkan / matikan MSAA
if (flagMSAA)
glDisable(GL_MULTISAMPLE);
else
glEnable(GL_MULTISAMPLE);
// panggil fungsi untuk menggambar obyek
drawObject();
// tampilkan obyek ke layar
// gunakan glFlush() bila memakai single buffer
// gunakan glutSwapBuffers() bila memakai double buffer
glutSwapBuffers();
}
Daftar Pustaka
Interactive Computer Graphics 6thEdition di :
Chapter 6 – Anti Aliasing di halaman 342-344.
Chapter 7 – Multi Sampling di halaman 410-411.
Chapter 7 – Sampling & Aliasing di halaman 413-421.
Pertemuan 07 Teksture Prosedural PDF
Praktikum 06