ウィンドウのサイズやビューポートを画像のサイズに合わせる。
なお、
- OpenGLはピクセルデータを描画する際にウィンドウの「左下」から描画する → 場合によっては反転する。
- ウィンドウをサイズを変更した時(reshapeが呼ばれた時) → 拡大・縮小対策
などの操作をいれるとよい。
[例]
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
//反転とウィンドウの拡大・縮小対策
glPixelZoom(static_cast<float>(w)/imgA->width, -static_cast<float>(h)/imgA->height);
glRasterPos2i(-1, 1);//反転した場合の描画位置
}
■ピクセルの拡大は、
glPixelZoom(static_cast<float>(w)/imgA->width, static_cast<float>(h)/imgA->height);
■上下反転は
glPixelZoom( 1.0f, -1.0f );
で実現でき、
これをひとつにまとめると、
glPixelZoom(static_cast<float>(w)/imgA->width, -static_cast<float>(h)/imgA->height);
となる。
注意点として反転した場合は、描画開始位置を「左上原点」の位置にする必要がある。
もし、glOrtho()やgluOrth2D()関数でスクリーンの3次元空間上のサイズを指定しない場合、
(2×2)のスクリーンが3次元空間上に用意される。
従って、スクリーンの左上は、(-1,1)となる。(スクリーンの中心が原点)
[例]:gluOrth2D()関数でスクリーンを設定
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,w,h,0);
glMatrixMode(GL_MODELVIEW);
glPixelZoom(static_cast<float>(w)/imgA->width, -static_cast<float>(h)/imgA->height);
glRasterPos2i(0, 0); //(0,0)を指定
}
※メモ
OpenCVの場合はcvFlip()関数で反転できる。