背景に何か描きたい場合

opengl-background.png

ファークリップ面と同じGL_QUADSを作る方法

ファークリップ面にぴったりくっつくような四角形を描いて、テクスチャを貼るなり、頂点に色を入れるなり好きにすればいい。
そのような四角形はどのように書けばいいのか??

zに関して

背景四角形のzをどの位置に置くかに関わるパラメータは

である。
背景四角形のz値-(far-z)にすればちょうどファークリップ面に背景がひっつく。ワールド座標ではzが負なのが奥ってことを忘れずに。
ビュー変換をする前であれば背景四角形のz値-(far)にすればいい。このほうが簡単。
シェーダを使う、などの事情で投影行列が効いてない状態でやるにはもっと簡単で、-1.0の位置に書けば良い。なぜなら、たぶん正規化デバイス座標の状態で書いているから。

背景四角形の縦横幅について

クリッピング座標の項目を参考にする。
正投影の場合はtop,left,bottom,rightの値をそのまま持ってくればいい。
透視投影の場合、ファークリップ面の縦横幅は
$\frac{f}{n}l$
$\frac{f}{n}r$
$\frac{f}{n}t$
$\frac{f}{n}b$
になっている。三角比で考えるのである。glFrustumで指定した場合には簡単だけど。
glPerspective()で指定しちゃった場合はどうなる?perspective-matrix透視投影の項目にglFrustumとglPerspectiveを変換するヒントが書かれている。それによると、
top near*tan(fovy*M_PI/360)$\frac{f}{n}$
bottom -top
left bottom*aspect
right top*aspect

このようにすればいい。

ソースコード

void reshape (int w, int h)
{
    //射影変換行列
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity (); 
    gRatio=(float)w / (float)h;
    glOrtho(-1.0,1.0,-1.0,1.0,nearclip,farclip);
    glMatrixMode (GL_MODELVIEW);
}
float bgz=-(farclip-0.1);//orthoの場合はfarclipよりちょっと手前にしないと見えなかった。
void DrawBackground(){
 
    float size=1.0;
    float bottomratio=0.2;//下の面積の割合
    glColor3d(1.0,1.0,1.0);
    glBegin(GL_QUADS);
    glColor3ubv(&bottomcolor.r); glVertex3f(-size*gRatio,-size,bgz);
    glVertex3f( size*gRatio,-size,bgz);
    glColor3ubv(&middlecolor.r);glVertex3f( size*gRatio,-size+size*2*bottomratio,bgz);
    glVertex3f(-size*gRatio,-size+size*2*bottomratio,bgz);
    glVertex3f(-size*gRatio,-size+size*2*bottomratio,bgz);
    glVertex3f( size*gRatio,-size+size*2*bottomratio,bgz);
    glColor3ubv(&topcolor.r);  glVertex3f( size*gRatio, size,bgz);
    glVertex3f(-size*gRatio, size,bgz);
    glEnd();
}

glDrawPixelsで書き込む方法

フルソースコードはここ
unsigned char* bgImage;
BITMAPINFOHEADER bitmapInfoHeader;
void InitBgImage(){
     HANDLE handle;
    DWORD temp=0;
    BITMAPFILEHEADER bitmapFileHeader;
 
    handle = CreateFile("cave.bmp",GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL );
    if(handle==INVALID_HANDLE_VALUE || handle==NULL){assert(!"ファイルが見つからない");}
    ReadFile(handle,&bitmapFileHeader,sizeof(BITMAPFILEHEADER),&temp,NULL);
    if ( temp!=sizeof(BITMAPFILEHEADER) || bitmapFileHeader.bfType!=0x4D42 )
    {
        CloseHandle(handle);
        assert(!"ビットマップじゃありません");
    }
    ReadFile(handle,&bitmapInfoHeader,sizeof(BITMAPINFOHEADER),&temp,NULL);
 
    bgImage=new unsigned char[bitmapInfoHeader.biWidth*bitmapInfoHeader.biHeight*3];
    ReadFile(handle,bgImage,bitmapInfoHeader.biWidth*bitmapInfoHeader.biHeight*3,&temp,NULL);
    CloseHandle(handle);
}

[http://isobe.exblog.jp/12212103/]


background projection-matrix

サポートサイト Wikidot.com backgroundprojection-matrix