Review Tekstur Prosedural

Tekstur Prosedural
Tekstur prosedural : tekstur yang dibuat dari sebuah fungsi yang menghitung nilai koordinat
tekstur
Misalnya : pola kayu, pola marmer, pola langit, dsb
Keuntungan :
 Tidak terpengaruh dimensi ukuran
 Membutuhkan ruang simpan yang kecil
 Dapat divariasikan sesuai kebutuhan
Kelemahan :
 Dibutuhkan pengetahuan tentang rumus fungsi tekstur
 Untuk fungsi yang kompleks pemrosesannya lambat
 Kemungkinan terdapat aliasing
CONTOH

Contoh Pola tekstur vasdisamping (pola marble) dibuat dengan tekstur prosedural yaitu
dengan perlin noise.
Environment Mapping
Pemetaan lingkungan : menggunakan tekstur untuk mewakili warna yang merefleksikan
lingkungan. Disebut juga reflection map karena memproduksi refleksi dari obyek yang
mengkilap Tekstur terindeks oleh vektor refleksi Tekstur dipindahkan ke arah sinar yang
dipantulkan dari peta lingkungan ke obyek
Rumus sinar yang dipantulkan :
R = 2 (N.V) N - V
Metode dari environment mapping :
 Sphere mapping
 Cube mapping
Sphere Mapping
Sphere mapping membuat citra melingkar yang merupakan proyeksi ortografik dari bola
(sphere) terhadap lingkungan yang dipetakan
Kelemahan :
refleksi lingkungan hanya efektif pada titik didekat origin
Cube mapping
Cube mapping berasumsi bahwa lingkungan seperti ruangan yaitu berbentuk kotak Proyeksi
dihitung dari keenam sisi ruangan
Illumination Mapping
Illumination mapping menggunakan tekstur untuk merepresentasikan pencahayaan
Bump Mapping
Bump mapping : metode untuk pemetaan tekstur permukaan kasar / tidak rata / bergelombang
/ bumpy
Contoh : tekstur kulit jeruk, strawberry
Bump Mapping
Caranya dengan menerapkan fungsi perturbation terhadap permukaan normal (surface
normal) kemudian menggunakan perturbed normal pada perhitungan model pencahayaannya
Caranya menggunakan tekstur untuk mengganggu permukaan normal Pertubation function /
bump function biasanya dibuat table yang disebut bump table agar perhitungan lebih cepat .
Perhitungan
Bila P (u,v) adalah posisi pada permukaan parametrik / tekstur maka permukaan normal pada
titik tersebut bisa dihitung dengan :
N = Pu x Pv
Dimana Pu dan Pv adalah turunan parsial P terhadap parameter u dan v
Untuk menghitung perturbed normal, ditambahkan pertubation function / bump function
b(u,v):
P’(u,v) = P(u,v) + b(u,v)n
Dimana n = N / |N| yaitu unit surface normal, sehingga peturbed surface normal dapat di
hitung kembali dengan :
N’ = P’u x P’v
N = N + bv (Pu x n) + bu (n x Pv)
N’ = N + D
Displacement Mapping
Displacement Mapping menggunakan tekstur untuk menggantikan geometri permukaan
Bedanya dengan bump mapping :
 Bump mapping menggunakan tekstur untuk mengubah permukaan normal
 Displacement mapping menggunakan tekstur untuk menggantikan permukaan
keseluruhan
Contoh Penerapan Program Lightning
// penyimpanan tekstur
// dalam hal ini satu tekstur saja
GLuint texture[1];
const int texWidth = 512;
const int texHeight = 512;
char texData[texWidth][texHeight][3]; // alokasi memori untuk tekstur 3D
double noiseData[texWidth][texHeight];
// fungsi untuk membangkitkan noise
void genNoise()
{
for (int i = 0; i < texHeight; i++)
{
for (int j = 0; j < texWidth; j++)
noiseData[i][j] = (rand() % 32768) / 32768.0;
}
}
// fungsi untuk menghaluskan noise
double smoothNoise(double x, double y)
{
// hitung nilai selisih fraksi dari x dan y
double fractX = x - int(x);
double fractY = y - int(y);
// hitung jumlah langkah
int x1 = (int(x) + texWidth) % texWidth;
int y1 = (int(y) + texHeight) % texHeight;
// hitung nilai ketetanggaan
int x2 = (x1 + texWidth - 1) % texWidth;
int y2 = (y1 + texHeight - 1) % texHeight;
// haluskan noise
double value = 0.0;
value += fractX * fractY * noiseData[y1][x1];
value += (1 - fractX) * fractY * noiseData[y1][x2];
value += fractX * (1 - fractY) * noiseData[y2][x1];
value += (1 - fractX) * (1 - fractY) * noiseData[y2][x2];
return value;
}
// fungsi untuk memberi turbulensi pada noise
double turbNoise(double x, double y, double size)
{
double value = 0.0, initialSize = size;
while (size >= 1)
{
value += smoothNoise(x / size, y / size) * size;
size /= 2.0;
}
return(128.0 * value / initialSize);
}
// fungsi untuk melakukaan pemetaan tekstur
int setTextures()
{
int status = FALSE;
// buat alokasi untuk teksturnya
glGenTextures(1, texture);
genNoise();
// buat tekstur dengan fungsi perlin
float perlinData;
for (int i = 0; i < texHeight; i++)
{
for (int j = 0; j < texWidth; j++)
{
// tekstur motif kayu dengan fungsi sinus
double xyPeriod = 12.0; // banyaknya lingkaran
double turbPower = 0.1; // dibuat twist
double turbSize = 32.0; // turbulensi
double xValue = (j - texWidth / 2) / double(texWidth);
double yValue = (i - texHeight / 2) / double(texHeight);
double distValue = sqrt(xValue * xValue + yValue * yValue)
+ 0.1 * turbNoise(j, i, turbSize) / 256.0;
double sineValue = 128.0 * fabs(sin(2 * xyPeriod * distValue *
3.14159));
texData[i][j][0] = (char)(80 + sineValue);
texData[i][j][1] = (char)(30 + sineValue);
texData[i][j][2] = 30;
//// tekstur rumput dengan perlin noise (grass procedural texture)
//perlinData = perlinNoise2D(i, j, 0.1f, 0.9f, 8.0f);
//texData[i][j][0] = (char)perlinData / 64;
//texData[i][j][1] = (char)perlinData;
//texData[i][j][2] = (char)perlinData / 64;
}
}
status = TRUE;
// bind tekstur dari fungsi perlin tadi
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB,
GL_UNSIGNED_BYTE, texData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return status;
}

Posting Komentar (0)
Lebih baru Lebih lama