Selasa, 16 Mei 2017

Code Block OpenGL Load Multi Tekstur


Halo rekan-rekan sekalian...jumpa lagi di artikel ogut yang menggunakan Code Block. Dan kali ini ogut akan memberikan contoh program me-load multi tekstur. Contoh program ini sangat bermanfaat bagi rekan-rekan yang ingin belajar membuat game 2D.

Bagi yang baru pertama kali mencoba Code Block silahkan klik link ini dahulu supaya tidak bingung.


OK langsung saja, program akan menghasilkan tampilan seperti gambar di bawah ini.Di gambar terlihat dua buah persegipanjang yang berisi tekstur kucing dan cakar kucing. Gambar kucing dan cakar kucing dibuat dari file bitmap 24 bit.


Untuk menampilkan kucing dan cakar kucing caranya sangat sederhana, perhatikanlah source di bawah ini.

 //cakar kucing
glBindTexture(GL_TEXTURE_2D, texture[1]);
    glBegin(GL_POLYGON);
        glTexCoord2f(0.0f, 0.0f);glVertex2d(-350.0d,-450.0d);
        glTexCoord2f(1.0f, 0.0f);glVertex2d(150.0d,-450.0d);
        glTexCoord2f(1.0f, 1.0f);glVertex2d(150.0d,-100.0d);
        glTexCoord2f(0.0f, 1.0f);glVertex2d(-350.0d,-100.0d);
glEnd();

//kucing
glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_POLYGON);
        glTexCoord2f(0.0f, 0.0f);glVertex2d(-100.0d,150.0d);
        glTexCoord2f(1.0f, 0.0f);glVertex2d(350.0d,150.0d);
        glTexCoord2f(1.0f, 1.0f);glVertex2d(350.0d,400.0d);
        glTexCoord2f(0.0f, 1.0f);glVertex2d(-100.0d,400.0d);
glEnd();

Untuk Load tekstur gunakan fungsi berikut ini.

unsigned int Create_Tekstur(char *file)
{
    unsigned int IDImage;

    FILE *pFile = 0;
    BITMAPFILEHEADER BmpFileHeader;
    BITMAPINFOHEADER BmpInfoHeader;
    unsigned char *BmpImage;

    unsigned char BGR_to_RGB = 0;

    int i;

    if ((pFile = fopen(file, "rb"))==NULL)
    {
        //printf("File Not Found : %s\n",filename);
        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( i = 0; i < (int)BmpInfoHeader.biSizeImage; i += 3)
    {
        BGR_to_RGB = BmpImage[i];
        BmpImage[i] = BmpImage[i + 2];
        BmpImage[i + 2] = BGR_to_RGB;
    }

    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);

    return IDImage;
}

Sampai disini dulu rekan-rekan

Salam


Heriady




-----------------------------------------------------------------------
-----------------------------------------------------------------------

Tidak ada komentar:

Posting Komentar