立方体の部屋

skybox.png

キューブマッピングするなら、周りの背景は不可欠!だよね?
背景になるようなレンダリングプリミティブがすっごく外側の遠くからみたら、上の図のようになっています。
つまり、立方体にテクスチャを貼った状態ってこと。
この6面にテクスチャを貼った立方体の箱の内側に視点があれば、あたかも背景のように見える仕組みです。
この立方体の箱はskyboxと呼ばれています
こういう写真は魚眼レンズとか使って撮るだろうけど、
素材はこういうサイトからゲットできます。

RoomCubeクラス

    template <typename T>
    struct RoomCube:cube<T>{
        RoomCube(){
            set(vec3<T>(0.0,0.0,0.0),(T)0.5);
        }
        RoomCube(T _size,vec3<T>& _offset){
            for(int i=0;i<8;i++){corner[i]=corner[i]*_size+_offset;}
        }
        GLuint mTexId[6];
        void set(vec3<T> &_center,T _size){//roomcubeの特質上y=0固定で 無限に上に広がっていったほうがいい。
            corner[0]=_center+vec3<T>(-_size,0.0,-_size);
            corner[1]=_center+vec3<T>( _size,0.0,-_size);
            corner[2]=_center+vec3<T>( _size, _size*2.0,-_size);
            corner[3]=_center+vec3<T>(-_size, _size*2.0,-_size);
 
            corner[4]=_center+vec3<T>(-_size,0.0, _size);
            corner[5]=_center+vec3<T>( _size,0.0, _size);
            corner[6]=_center+vec3<T>( _size, _size*2.0, _size);
            corner[7]=_center+vec3<T>(-_size, _size*2.0, _size);
        }
        void DrawQuadsWithTexture(){
            glEnable(GL_CULL_FACE);
            glEnable(GL_TEXTURE_2D);
 
            //positive x
            glBindTexture(GL_TEXTURE_2D , mTexId[0]);
            glBegin(GL_QUADS);
            glTexCoord2i(0,0);corner[5].glVertex();glTexCoord2i(0,1);corner[6].glVertex();
            glTexCoord2i(1,1);corner[2].glVertex();glTexCoord2i(1,0);corner[1].glVertex();
            glEnd();
            //negative x
            glBindTexture(GL_TEXTURE_2D , mTexId[1]);
            glBegin(GL_QUADS);
            glTexCoord2i(0,0);corner[0].glVertex();glTexCoord2i(0,1);corner[3].glVertex();
            glTexCoord2i(1,1);corner[7].glVertex();glTexCoord2i(1,0);corner[4].glVertex();
            glEnd();
            //positive y
            glBindTexture(GL_TEXTURE_2D , mTexId[2]);
            glBegin(GL_QUADS);
            glTexCoord2i(0,0);corner[7].glVertex();glTexCoord2i(0,1);corner[3].glVertex();
            glTexCoord2i(1,1);corner[2].glVertex();glTexCoord2i(1,0);corner[6].glVertex();
            glEnd();
            //negative y
            glBindTexture(GL_TEXTURE_2D , mTexId[3]);
            glBegin(GL_QUADS);
            glTexCoord2i(0,0);corner[0].glVertex();glTexCoord2i(0,1);corner[4].glVertex();
            glTexCoord2i(1,1);corner[5].glVertex();glTexCoord2i(1,0);corner[1].glVertex();
            glEnd();
            //positive z
            glBindTexture(GL_TEXTURE_2D , mTexId[4]);
            glBegin(GL_QUADS);
            glTexCoord2i(0,0);corner[4].glVertex();glTexCoord2i(0,1);corner[7].glVertex();
            glTexCoord2i(1,1);corner[6].glVertex();glTexCoord2i(1,0);corner[5].glVertex();
            glEnd();
            //negative z
            glBindTexture(GL_TEXTURE_2D , mTexId[5]);
            glBegin(GL_QUADS);
            glTexCoord2i(0,0);corner[1].glVertex();glTexCoord2i(0,1);corner[2].glVertex();
            glTexCoord2i(1,1);corner[3].glVertex();glTexCoord2i(1,0);corner[0].glVertex();
            glEnd();
            glDisable(GL_TEXTURE_2D);
            glDisable(GL_CULL_FACE);
        }
    };

部屋の壁に貼るテクスチャの初期化

void CPlyRender::InitWall(void)
{
    stringstream filename;
    filename.str("");
 
    for(int i=0;i<6;i++){
        filename.str("");
        filename<<"cubemap/"<<CUBENAME<<"/"<<i<<".tga";
        GLFWimage img;
        if(!glfwReadImage( filename.str().c_str(),&img, 0 )){assert(!"画像が見つかりません");}
        glGenTextures(1, &mRoom.mTexId[i] );
        glBindTexture(GL_TEXTURE_2D, mRoom.mTexId[i] );
        cout<<filename.str()<<endl;
        cout<<"mRoom.mTexId[i]"<<mRoom.mTexId[i]<<endl;
 
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.Width,img.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, img.Data);
        glfwFreeImage(&img);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        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_S, GL_CLAMP_TO_EDGE );
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    }
 
}
Bibliography

cubemap skybox

サポートサイト Wikidot.com cubemapskybox