在opengl-es中使用2D正交投影时,从未获得完整的480*800

Ech*_* Lu 5 android opengl-es

我正在使用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);                         
 } 
Run Code Online (Sandbox Code Playgroud)

三角形的坐标是:

float[] coords = {
            // X, Y, Z
            0.0f, 0.0f, 0,
            200.0f, 200.0f, 0,
            100.0f, 0.0f, 0,
    }; 
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

alt text http://www.anddev.org/files/device_184.png

这个结果在仿真器(480*800 res)和Nexus 1上是相同的.显然我没有得到全分辨率(因为三角形的顶部顶点已经接近右边缘,如果宽度是真实480,这应该是在半宽的左边).另一个奇怪的是,在sizeChanged(我正在使用GLSurfaceView,这是GLSurfaceView所需的渲染器中的覆盖方法),无论我是否以全屏模式启动应用程序,我总是得到width = 480和height = 800.我期待使用app标题栏和状态栏,传递给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"/>
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中的标记.特别是,我发现它似乎只有android:anyDensity ="true"|"false"很重要,因为这会改变渲染结果.其他人根本不改变结果.我的项目也在SDK 1.6上,建议用于开发支持更大手机屏幕的应用程序.

最初的问题也在这里提出:http://www.anddev.org/viewtopic.php?p = 34832#34832

小智 0

我知道有一个 OpenGL 线程涵盖了 16.、2.0 等之间的差异,其中包含这些开发游戏等的详细信息,您将不得不在谷歌主页上搜索它,因为开发列表谷歌搜索很糟糕

我还会检查 bug 数据库,因为每个发现 OpenGl bug 的人都将工作 aorudns 放入错误报告中,包括我

在其他地方检查 Alien3d 项目的 bug 数据库,在 googlecode 其 3d android 游戏引擎也许他们遇到了它?