在OpenGL ES中使用2D正交投影时,无法获得完整的480*800分辨率。

6
我正在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分辨率)和Nexus 1上是相同的。显然,我没有得到完整的分辨率(因为三角形的顶点已经接近右侧边缘,如果宽度是真正的480,那么应该在半宽的左侧)。另一个奇怪之处在于,在sizeChanged中(我正在使用GLSurfaceView,在渲染器中覆盖此方法是由GLSurfaceView要求的),无论我是否以全屏模式启动应用程序,我始终获得宽度=480和高度=800。我原本期望通过应用程序标题栏和状态栏,传递给sizeChanged的大小应该更小,对吗?我的意思是,如果传递给此方法的大小不是我实际获得的真实大小,那么我如何设置正确的视口呢?

我还使用相同的设置在Windows上快速实现了一个使用GLUT的版本,并绘制了完全相同的三角形。我得到了预期的结果,任何人都可以帮助我找出如何在手机上获得相同的结果吗?

alt文本 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个回答

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时,请使用android.opengl.GLSurfaceView而不是sdk_root\platforms\android-1.1\samples\ApiDemos\src\com\example\android\apis\graphics文件夹中的GLSurfaceView.java。因为后者是早期版本,有一些奇怪的行为。


1
当使用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。

1

需要检查的一件事是确保您清单中使用-sdk元素的android:minSdkVersion属性为4或更高版本。在该元素上具有android:targetSdkVersion属性且为4或更高版本也可以工作。

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


0

我知道有一个OpenGL线程,涵盖了16.、2.0等之间的差异,其中包括那些开发游戏的详细信息,你需要在主要的谷歌页面上搜索它,因为开发者列表的谷歌搜索很糟糕。

我还会检查bug数据库,因为每个发现OpenGl bug的人都倾向于在他们的bug报告中放置工作环境,包括我自己。

其他地方可以检查alien3d项目的bug数据库,它是一个3D安卓游戏引擎,也许他们遇到了这个问题?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接