Sabtu, 30 Mei 2015

Tekstur TGA 32 bit untuk Objek 3D

Pagi hari yang mendung, hujan dari semalem tidak berhenti-henti...padahal hari ini hari libur


Selamat Pagi rekan-rekan sekalian yang ganteng-ganteng dan yang cantik-cantik...
Hari ini aku akan memberikan contoh tesktur yang lain dari sebelumnya, pada artikel sebelumnya aku membahas tentang file bitmap 24 bit yang dijadikan tekstur. Kali ini aku akan memperkenalkan file TGA 32 bit yang akan dijadikan tesktur.


Pada gambar di atas rekan-rekan bisa melihat pagar dan daun, pagar dibentuk dari 1 (satu polygon) dan diberi tekstur TGA 32 bit. Tetapi ada bagian dari pagar yang transparan, sehingga objek 3D (pohon) di belakangnya akan tampak. Tekstur TGA 32 bit banyak digunakan untuk objek 3D seperti pagar dan daun, tujuannya untuk memudahkan pemrograman serta menghemat jumlah polygon. Objek 3D pohon adalah contoh objek 3D yang bisa digunakan untuk game 3D karena hanya menggunakan sedikit polygon (pohon dibuat dengan menggunakan 3ds max).


File TGA 32 bit bisa dibuat dengan bantuan software pengolah citra seperti Photoshop (gambar di atas).
Untuk membuat tekstur TGA 32 bit diperlukan fungsi load dan jangan lupa untuk menambahkan dua baris perintah berikut ini.

----------------------------------------------------
//untuk TGA tekstur
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
----------------------------------------------------

bool LoadTGA(unsigned int &TeksturID, char *filename)
{
    unsigned char    standard_tga_header[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    unsigned char    *tga_Data;
    unsigned int    tga_width;
    unsigned int    tga_height;

    unsigned char    Load_tga_header[12];
    unsigned char    tga_header_6bytes[6];

    unsigned int    byte_per_pixel;
    unsigned int    tga_image_size;
    unsigned int    temp_tga_Data;
    int i;


    FILE *file = 0;
    errno_t err;

    if ((err = fopen_s(&file, filename, "rb")) != 0)
    {
        MessageBox(NULL, _T("Error open file TGA"), _T("Load TGA Error"), MB_OK);
        return false;
    }

    //load tga header dari file tga,   
    if (fread(Load_tga_header, 1, sizeof(Load_tga_header), file) != sizeof(Load_tga_header))
    {
        MessageBox(NULL, _T("Error open file TGA"), _T("Fail to Read TGA Header"), MB_OK);

        fclose(file);
        return false;
    }

    //bandingkan header file TGA dengan standard TGA header   
    if (memcmp(standard_tga_header, Load_tga_header, sizeof(standard_tga_header)) != 0)
    {
        MessageBox(NULL, _T("Error open file TGA"), _T("Not TGA Format"), MB_OK);

        fclose(file);
        return false;
    }

    //load 6 bytes tga header (penting)
    if (fread(tga_header_6bytes, 1, sizeof(tga_header_6bytes), file) != sizeof(tga_header_6bytes))
    {
        MessageBox(NULL, _T("Error open file TGA"), _T("Fail to Read 6 byte TGA Header"), MB_OK);

        fclose(file);
        return false;
    }

    tga_width = tga_header_6bytes[1] * 256 + tga_header_6bytes[0];
    tga_height = tga_header_6bytes[3] * 256 + tga_header_6bytes[2];

    if (tga_header_6bytes[4] != 32)
    {
        MessageBox(NULL, _T("Error open file TGA"), _T("data not 32 bit"), MB_OK);

        fclose(file);
        return false;
    }

    byte_per_pixel = tga_header_6bytes[4] / 8;
    tga_image_size = tga_width * tga_height * byte_per_pixel;

    tga_Data = (unsigned char *)malloc(tga_image_size);

    if (tga_Data == NULL)
    {
        MessageBox(NULL, _T("Error open file TGA"), _T("Fail to allocate memory"), MB_OK);

        fclose(file);
        return false;
    }

    if (fread(tga_Data, 1, tga_image_size, file) != tga_image_size)
    {
        if (tga_Data != NULL)
            free(tga_Data);

        MessageBox(NULL, _T("Error open file TGA"), _T("Fail to Creat image data"), MB_OK);

        fclose(file);
        return false;
    }

    //rubah dari BGR ke RGB
    for (i = 0; i < (int)tga_image_size; i += byte_per_pixel)
    {
        temp_tga_Data = tga_Data[i];
        tga_Data[i] = tga_Data[i + 2];
        tga_Data[i + 2] = temp_tga_Data;
    }

    //start to generate texture
    glGenTextures(1, &TeksturID);

    glBindTexture(GL_TEXTURE_2D, TeksturID);

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tga_width, tga_height, GL_RGBA, GL_UNSIGNED_BYTE, tga_Data);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tga_width, tga_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tga_Data);

    fclose(file);

    //clear unused memory   
    free(tga_Data);

    //return tga_texture_ID;                                               
    return true;


Sampai Jumpa lagi di artikel berikutnya, maju terus pemrogramman tanah air.


Heriady
heriady.yoh@gmail.com


Download program tekstur TGA 32 bit tinggal Anda klik link ini, ngak usah repot-repot ngetik lagi capek.


Artikel terkait
Program tekstur bitmap 24 bit