0

私は OpenGL ES を初めて使用し、テクスチャ付きのクワッドを描画しようとしています。2D のままにしたいので、正投影を使用することにしました。私が本当に望んでいるのは、画面の解像度に関係なく、すべてのデバイスで同じ相対的な画面スペースを占める平面を描くことです。

私が遭遇する問題は、正投影の設定です。アスペクト比が正しくありません。正方形は高さの長方形として描画されます。これまでの私のコードは次のとおりです。

レンダラー:

// automatically looped by android
public void onDrawFrame(GL10 gl) {
    // clear screen and buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // Draw elements
    for (GameObject object : level.getGameObjects()) {
        gl.glScalef(0.2f, 0.2f, 0.0f);
        object.draw(gl);
        gl.glLoadIdentity();
    }
}

public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);
    gl.glOrthof(0f, 480f, 0f, 800f, -1f, 1f);

}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // Load all textures
    for (GameObject object : level.getGameObjects()) {
        object.bindTexture(gl);
    }

    // Initialize game canvas
    gl.glEnable(GL10.GL_TEXTURE_2D); // Enable Texture Mapping
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black background

    // enable texture transparency
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA,   GL10.GL_ONE_MINUS_SRC_ALPHA);               
}   

描画方法は、このチュートリアルとまったく同じです: http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/

よろしく、ダーン

4

3 に答える 3

2

幅と高さをglOrthofにハードコーディングするのはなぜですか?渡された幅と高さを使用するべきではありませんか?

gl.glOrthof(0f, width, 0f, height, -1f, 1f);

于 2012-05-25T17:54:16.397 に答える
2

私は自分の問題に対する答えを見つけました。まず、幅と高さをハードコーディングしていましたが、これは適切なオプションではありませんでした。すべての画面解像度で固定するために、アスペクト比を計算し、高さにはアスペクト比を掛けたものを使用します。

もう 1 つの問題は、glortho を設定する前に射影行列をリセットしていなかったことです。私はこれをすべて変更し、問題を解決しました:

public void onSurfaceChanged(GL10 gl, int width, int height) {      
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrthof(0f, 320, 0f, 320*aspect, -1f, 1f);
}

これが誰かの役に立てば幸いです。

よろしく、ダーン

于 2012-05-25T18:50:01.470 に答える