【问题标题】:Never got full 480*800 when using 2D orthogonal projection in opengl-es在opengl-es中使用2D正交投影时从未得到完整的480 * 800
【发布时间】: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

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

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

    我有罪...但是让我们小心复制的内容,因为您相信它会按照您预期的方式执行某些操作,但事实并非如此,这是我从 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 时,请使用 android.opengl.GLSurfaceView 而不是示例文件夹 sdk_root\platforms\android-1.1\samples\ApiDemos\src\com\example\android\apis\graphics 中的 GLSurfaceView.java。因为后者是早期版本,并且有一些奇怪的行为。

    【讨论】:

      【解决方案2】:

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

      它将使用标准的 320x480 | 480x320 分辨率

      这是我如何获得一些显示信息:

      // 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();
      

      为了让我的应用使用手机完整的原生资源,我没有找到任何东西,所以不得不切换到使用 sdk 版本 6。

      【讨论】:

        【解决方案3】:

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

        您的问题确实表明您的项目是 Android 1.6,即 API 级别 4。但是,可以将构建目标设为 Android 1.6,但仍可以在 uses-sdk 元素中指定较旧的 API 级别。当有人开始使用 Android 1.5 项目并更改构建目标时,通常会发生这种情况。 Eclipse 在更改构建目标时不会更新清单。

        【讨论】:

          【解决方案4】:

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

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

          其他地方可以在googlecode其3d android游戏引擎上检查alien3d项目的错误数据库,也许他们遇到了?

          【讨论】:

            猜你喜欢
            • 2012-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-17
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多