Selamat Pagi rekan-rekan sekalian, kembali lagi ogut nge-blog nih dan kali ini ogut akan membagikan program untuk membuat tekstur abu-abu atau grayscale tekstur.
Kadang kala dalam satu pemrograman grafik atau game kita diharuskan mengubah tekstur menjadi abu-abu atau grayscale. Pada gambar di bawah ini Anda dapat melihat sebuah tekstur warna warni, diubah menjadi abu-abu.
Untuk membuat tekstur seperti ini caranya sangat sederhana, Anda hanya mengganti nilai R, G dan B dengan nilai rata-rata RGB.
BGR_to_RGB = BmpImage[i]; //nilai R
BmpImage[i] = BmpImage[i + 2]; //nilai G
BmpImage[i + 2] = BGR_to_RGB; //nilai B
//ubah ke Black White (nilai rata-rata RGB)
RGBDiv = char((BmpImage[i] + BmpImage[i + 1] + BmpImage[i + 2]) / 3);
//isi dengan nilai rata-rata
BmpImage[i] = RGBDiv;
BmpImage[i + 1] = RGBDiv;
BmpImage[i + 2] = RGBDiv;
Pada koding di atas Anda dapat melihat untuk menentukan nilai rata-rata RGB tambahkan ketiga nilai lalu dibagi dengan 3 (hasil bagi harus bilangan bulat), lalu isikan nilai RGB dengan nilai rata-rata tersebut.
Cara lain yang dapat Anda lakukan dengan menggunakan formula atau rumus berikut ini.
0.21 R + 0.72 G + 0.07 B
Diprogram contoh ogut menyertakan kedua cara ini, Anda tinggal me-remark nilai yang tidak diperlukan.
Ini adalah fungsi yang ogut gunakan untuk membuat tekstur abu-abu, harap diperhatikan ukuran file bitmap 24 bit yang akan dijadikan tekstur harus kelipatan pangkat 2 (32, 64, 128, 256, dst....)
unsigned int CreateGSTexture(char *file)
{
FILE *pFile = 0;
BITMAPFILEHEADER BmpFileHeader;
BITMAPINFOHEADER BmpInfoHeader;
unsigned char *BmpImage;
unsigned int IDImage;
unsigned char BGR_to_RGB = 0;
unsigned char RGBDiv = 0;
//pFile = fopen(file, "rb");
errno_t err;
err = fopen_s(&pFile, file, "rb");
//if(!fp)
if (err != 0)
{
MessageBox(NULL, file, "File Bmp tidak ditemukan, BMP Error 01", MB_OK);
return NULL;
}
fread(&BmpFileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);
if (BmpFileHeader.bfType != 0x4D42)
{
fclose(pFile);
MessageBox(NULL, file, "Format file bukan Bmp, BMP Error 02", MB_OK);
return NULL;
}
fread(&BmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);
if (BmpInfoHeader.biSizeImage == 0)
BmpInfoHeader.biSizeImage = BmpInfoHeader.biWidth * BmpInfoHeader.biHeight * 3;
fseek(pFile, BmpFileHeader.bfOffBits, SEEK_SET);
BmpImage = (unsigned char*)malloc(BmpInfoHeader.biSizeImage);
if (!BmpImage)
{
free(BmpImage);
fclose(pFile);
MessageBox(NULL, file, "Gagal alokasi memory untuk texture, BMP Error 03", MB_OK);
return NULL;
}
fread(BmpImage, 1, BmpInfoHeader.biSizeImage, pFile);
fclose(pFile);
if (BmpImage == 0)
{
MessageBox(NULL, file, "Gagal membaca data Bmp, BMP Error 04", MB_OK);
return NULL;
}
for (int i = 0; i < (int)BmpInfoHeader.biSizeImage; i += 3)
{
BGR_to_RGB = BmpImage[i];
BmpImage[i] = BmpImage[i + 2];
BmpImage[i + 2] = BGR_to_RGB;
//ubah ke Black White
RGBDiv = char((BmpImage[i] + BmpImage[i + 1] + BmpImage[i + 2]) / 3);
//=============================
//0.21 R + 0.72 G + 0.07 B
//coba ganti nilai rata2 RGB di atas dengan rumus di bawah ini
//=============================
//RGBDiv = char((BmpImage[i] * 0.21f) + (BmpImage[i + 1] * 0.72f) + (BmpImage[i + 2] * 0.07f));
BmpImage[i] = RGBDiv;
BmpImage[i + 1] = RGBDiv;
BmpImage[i + 2] = RGBDiv;
}
if (BmpImage == 0)
{
MessageBox(NULL, file, "Gagal membuat RGB texture, BMP Error 05", MB_OK);
return NULL;
}
//generate texture
glGenTextures(1, &IDImage);
glBindTexture(GL_TEXTURE_2D, IDImage);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, BmpInfoHeader.biWidth, BmpInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, BmpImage);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, BmpInfoHeader.biWidth, BmpInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, BmpImage);
if (BmpImage)
{
free(BmpImage);
BmpImage = 0;
}
return IDImage;
}
Sampai disini dulu artikel kali ini, semoga artikel ini bisa bermanfaat, salam
Heriady
heriady.yoh@gmail.com
Artikel terkait
Objek Tangki Air 3D
| |
Tekstur untuk Objek 3D
| |
Membuat File Bitmap 24 Bit
|
Tidak ada komentar:
Posting Komentar