LoginSignup
13
11

More than 5 years have passed since last update.

OpenGL ES1.0でビューポート領域と画面サイズを合わせる方法

Posted at

はじめに

OpenGL ESGLSurfaceView を使ってアンドロイドアプリを作成するとき、ビューポート領域と画面サイズを合わせるための方法を紹介します。

GLSurfaceView.Rendererの設定

GLSurfaceView.Rendererインターフェースを実装するクラス内で設定をします。
ビューポートの設定と座標系の設定は、 onSurfaceChangedメソッド内で行います。
onSurfaceChangedメソッドは、画面の縦向きと横向きが変更されるときに呼ばれるため、縦向きと横向きの両方に対応するアプリを作成することも可能です。
ここで、SCREEN_WIDTHSCREEN_HEIGHTは作成するアプリの解像度とします。

GLRenderer.java
public class GLRenderer implements GLSurfaceView.Renderer {

    //
    // その他のフィールド・メソッドなど
    //

    @Override
    public void onSurfaceChanged(GL10 gl10, int w, int h) {
        // ビューポートの設定
        double scaleX = (double)w / SCREEN_WIDTH;
        double scaleY = (double)h / SCREEN_HEIGHT;
        double scale = scaleX > scaleY ? scaleY : scaleX;
        int dpW = (int)(scale * SCREEN_WIDTH);
        int dpH = (int)(scale * SCREEN_HEIGHT);
        int offsetX = (w - dpW) / 2;
        int offsetY = (h - dpH) / 2;
        gl10.glViewport(offsetX, offsetY, dpW, dpH);

        // 投影変換行列の設定
        gl10.glMatrixMode(GL10.GL_PROJECTION);
        gl10.glLoadIdentity();
        // 幅、高さを設定
        // ビューポート領域内の座標系を左上(0, 0)、右下(SCREEN_WIDTH, SCREEN_HEIGH)に設定
        // 3Dを描画するときはZ方向の描画距離を変更する
        gl10.glOrthof(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -1.0f, 1.0f);

        // タッチスクリーンの領域設定
        // 今回は使用しない
        // TouchManager.setScreenArea(offsetX, h - dpH - offsetY, dpW, dpH);
    }
}

イメージ図

glOrthofメソッドで指定した領域 (SCREEN_WIDTH, SCREEN_HEIGHT) がビューポート内に描画されます。
ビューポートのY方向のオフセットは描画可能な領域の下部からの距離となります。
viewport.png

おわりに

描画と同様に、画面タッチの座標も変換しなければいけません。
次回は、タッチ座標の変換について記述したクラスを紹介します。

参考

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11