0

我对 OpenGL ES 很陌生,我正在尝试绘制一些带纹理的四边形。我想保持它是二维的,所以我决定使用正交投影。我真正想要的是绘制一个平面,它在每个设备上占用相同的相对屏幕空间,而不管屏幕分辨率如何。

我遇到的问题是正交投影的设置。纵横比是不正确的。一个正方形在高度上被绘制为一个矩形。到目前为止,这是我的代码:

渲染器:

// 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

我找到了我的问题的答案。首先,我对宽度和高度进行了硬编码,这不是一个好的选择。为了在所有屏幕分辨率上固定,我现在计算纵横比,对于高度,我使用 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);
}

我希望这对某人有帮助。

亲切的问候,大安

于 2012-05-25T18:50:01.470 回答
0

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

于 2013-08-13T16:17:03.507 回答