キューブマップ

cubemap.png

なんだか破廉恥な角度になってしまったけど、偶然です!
キューブマッピングを使うと、このように、
つるつるピカピカ金属みたいな効果が出る。
ようは、周りの背景をオブジェクトに写り込ませているのだ。

サンプルソースコード(git)

使う準備

  1. 上下左右前後、6枚の画像を用意する
  2. glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X…)などをする 6面全部1
  3. glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);

2.で使うターゲット

cubemap.jpg
0 GL_TEXTURE_CUBE_MAP_POSITIVE_X
1 GL_TEXTURE_CUBE_MAP_NEGATIVE_X
2 GL_TEXTURE_CUBE_MAP_POSITIVE_Y 天井
3 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
4 GL_TEXTURE_CUBE_MAP_POSITIVE_Z 手前
5 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
void InitCubeMapping(){
    const int TEXSIZE=128;
    unsigned char texImage[6*TEXSIZE*TEXSIZE*3];
    GLenum target[]={
        GL_TEXTURE_CUBE_MAP_POSITIVE_X,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
    };
    stringstream filename;
     glGenTextures(1,  &mTexId[CUBEMAP]);
    glBindTexture(GL_TEXTURE_CUBE_MAP, mTexId[CUBEMAP]);
    for(int i=0;i<6;i++){
 
        filename.str("");
        filename<<i<<".bmp";
        miffy::Read24bitBitmap(filename.str().c_str(),&texImage[i*TEXSIZE*TEXSIZE*3]);
        glTexImage2D(target[i],0,GL_RGB,TEXSIZE,TEXSIZE,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,&texImage[i*TEXSIZE*TEXSIZE*3]);
    }
// テクスチャを拡大・縮小する方法の指定 
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
        // テクスチャの繰り返し方法の指定 
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_LINEAR);
// キューブマッピング用のテクスチャ座標を生成する 
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
}

描くとき

glBindTexture(GL_TEXTURE_CUBE_MAP, mTexId[CUBEMAP]);
glEnable(GL_TEXTURE_CUBE_MAP);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glEnable(GL_TEXTURE_GEN_R);
 
    //draw!
 
    glDisable(GL_TEXTURE_CUBE_MAP);
    glDisable(GL_TEXTURE_GEN_S);
    glDisable(GL_TEXTURE_GEN_T);
    glDisable(GL_TEXTURE_GEN_R);
glBindTexture(GL_TEXTURE_2D, 0);

資料


skybox

サポートサイト Wikidot.com skybox