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

时间:2010-02-03 19:31:33

标签: 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);                         
 } 

三角形的坐标为:

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。我期待使用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"/>
AndroidManifest.xml中的

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

此处还询问了原始问题:http://www.anddev.org/viewtopic.php?p=34832#34832

4 个答案:

答案 0 :(得分:4)

感谢您的所有答案,他们帮助了我很多。我发现自己非常尴尬地告诉你这个问题的真正原因,我刚刚解决了这个问题。我从其中一个样本中复制的三角形类实际上在您在位置数组中定义的坐标上缩放了两倍!我只是修改了数组中的坐标,我没有注意到它们被加载到顶点缓冲区时,它们会被缩放!

我很内疚......但是,让我们小心处理复制过的东西,因为你相信它会以你期望的方式做某事,但事实并非如此,这是我从http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/OpenGLES/Triangle/src/com/google/android/opengles/triangle/TriangleRenderer.java复制代码的三角形类,并注意在第215行,位置缩放2!真是邪恶的样本......

此外,使用GLSurfaceView时,请在示例文件夹sdk_root \ platforms \ android-1.1 \ samples \ ApiDemos \ src \ com \ example \ android \ apis \ graphics中使用android.opengl.GLSurfaceView而不是GLSurfaceView.java。因为后者是早期版本并且有一些奇怪的行为。

答案 1 :(得分:1)

使用SDK版本3运行时,您的应用将以“兼容模式”

运行

它将使用标准的320x480 | 480x320 res

以下是我获取显示信息的方法:

// we get some display information 
    display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    scrPixelFormat = display.getPixelFormat();
    scrWidth = display.getWidth(); 
    scrHeight = display.getHeight();
    scrRefreshRate = display.getRefreshRate();

要让我的应用程序使用手机完全原生res,我没有找到任何东西,所以不得不切换到使用sdk版本6.

答案 2 :(得分:1)

要检查的一件事是确保清单中uses-sdk元素的android:minSdkVersion属性为4或更大。在该元素上具有4或更大的android:targetSdkVersion属性也可以。

你的问题确实说你的项目是Android 1.6,它是API级别4.但是,构建目标可能是Android 1.6,但仍然在uses-sdk元素中指定了较旧的API级别。当有人开始使用Android 1.5项目并更改构建目标时,通常会发生这种情况。更改构建目标时,Eclipse不会更新清单。

答案 3 :(得分:0)

我知道有一个OpenGL线程涵盖了16,2.0等之间的差异,其中包含那些开发游戏等的详细信息,你将不得不谷歌在主谷歌页面上作为开发者列表google搜索糟透了

我还会检查bug db,因为每个人都会发现OpenGl错误tedns将工作内容放入包括我在内的bug报告中

在googlecode上查看alien3d项目的bug db的其他地方,它的3D安卓游戏引擎可能会碰到它吗?