Android OpenGL ES正交奇怪的宽高比

时间:2012-05-25 15:53:40

标签: java android opengl-es

我对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);               
}   

draw方法与本教程中的完全相同:http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/

亲切的问候, 大安

3 个答案:

答案 0 :(得分:2)

为什么要将宽度和高度硬编码到glOrthof?你不应该使用传入的宽度和高度吗?

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

答案 1 :(得分:1)

我找到了问题的答案。首先,我对宽度和高度进行了硬编码,这不是一个好选择。要在所有屏幕分辨率上固定,我现在计算宽高比,对于高度,我使用with乘以宽高比。

另一个问题是我在设置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);
}

我希望这对某些人有帮助。

亲切的问候, 大安

答案 2 :(得分:0)

看起来你已经解决了。你能否详细说明你如何计算方面变量(高度和宽度的划分?)正如一个FYI,传递给onSurfaceChanged()事件的高度和宽度值确实是动态的。例如,当您翻转屏幕方向时,它们会反转。 我对此也比较陌生,但在我的桌面浏览器体验中,当窗口大小发生变化时,将这些因素考虑在内是非常重要的。