我对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/
亲切的问候, 大安
答案 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()事件的高度和宽度值确实是动态的。例如,当您翻转屏幕方向时,它们会反转。 我对此也比较陌生,但在我的桌面浏览器体验中,当窗口大小发生变化时,将这些因素考虑在内是非常重要的。