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

标签 android opengl-es

我正在 Nexus One 上用 OpenGL ES 做一个小实验。全屏分辨率有问题。似乎我永远无法获得 Nexus One 的真正全分辨率,即 480*800。我正在使用正交投影,只想绘制一个带有恒等模型 View 矩阵的简单三角形:

@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 的​​大小应该更小,对吗?我的意思是,如果传递给此方法的尺寸不是我得到的实际尺寸,那么我该如何设置正确的视口(viewport)?

我还使用相同设置在 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

最佳答案

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

我有罪......但是让我们小心复制的东西,因为你相信它会按照你预期的方式做事,但它没有,这是我从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。由于后者是早期版本并且有一些奇怪的行为。

关于android - 在 opengl-es 中使用 2D 正交投影时从未得到完整的 480*800,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2194834/

相关文章:

java - 使用 backstack 时 android.app.Fragment 和 android.support.v4.app.Fragment 的不同行为

java - 是否可以在运行时禁用android 6请求权限并使其从AndroidManifest正常工作?

Android native Activity ,GLES 3.0 着色器编译失败

java - OpenGL ES glReadPixels 返回错误值

android - LibGDX 和 ObjLoader 不显示 .mtl?

java - 如何在java、android中初始化巨大的 float 组?

ios - 如何使用 OpenGL ES 共享组在 iPad 上共享渲染缓冲区以进行屏幕镜像?

java - 我在 android 上使用 java 时遇到异常 (java.lang.NoClassDefFoundError),为什么?

android - WorkManager 重试不工作

android - 如何在 onSaveInstanceState 中保存一个 JSONObject?