【发布时间】:2011-01-12 18:47:41
【问题描述】:
我正在 Nexus One 上使用 OpenGL ES 做一个小实验。遇到全屏分辨率问题。似乎我永远无法获得 Nexus One 的真正全分辨率,即 480*800。我正在使用正交投影,只想用身份模型视图矩阵绘制一个简单的三角形:
@Override
public void sizeChanged(GL10 gl, int width, int height) {
/*
* Set our projection matrix. This doesn't have to be done
* each time we draw, but usually a new projection needs to
* be set when the viewport is resized.
*/
gl.glViewport( 0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, 0, width, 0, height);
}
三角形的坐标是:
float[] coords = {
// X, Y, Z
0.0f, 0.0f, 0,
200.0f, 200.0f, 0,
100.0f, 0.0f, 0,
};
我得到以下结果:
alt text http://www.anddev.org/files/device_184.png
这个结果在模拟器(480*800 res)和 Nexus 1 上是一样的。显然我没有得到完整的分辨率(因为三角形的顶部顶点已经接近右边缘,如果宽度是真正的 480,这应该在一半宽度的左侧)。另一个奇怪的是,在sizeChanged中(我使用的是GLSurfaceView,这是GLSurfaceView需要的渲染器中的覆盖方法),无论我是否以全屏模式启动应用程序,我总是得到width = 480和height = 800。我期待使用应用程序标题栏和状态栏,传递给 sizeChanged 的大小应该更小吧?我的意思是,如果传递给此方法的尺寸不是我得到的真实尺寸,那么我该如何设置正确的视口?
我还使用相同的设置在 Windows 上使用 GLUT 进行了快速实现,并绘制了完全相同的三角形。我得到下面的结果,这是预期的结果。任何人都可以帮助我弄清楚如何在手机上获得相同的结果?
alt text http://www.anddev.org/files/glut_on_win_137.png
我已经放了
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>
AndroidManifest.xml 中的标签。特别是,我发现似乎只有 android:anyDensity="true"|”false” 很重要,因为这确实会改变渲染结果。其他人根本不会改变结果。另外我的项目是在 SDK 1.6 上,推荐用于开发支持更大手机屏幕的应用程序。
原来的问题也在这里问:http://www.anddev.org/viewtopic.php?p=34832#34832
【问题讨论】: