Android 在安卓和iOS中,结果不同

Android 在安卓和iOS中,结果不同,android,ios,opengl-es,viewport,Android,Ios,Opengl Es,Viewport,我刚刚开始使用opengl es为我的跨平台框架(iOS和Android)开发渲染器。当我谈到viewport的东西时(这是splitscreen的东西所需要的),我注意到iOS和Android之间存在差异。这里有两张图片 Android 实际上还有一个小故障。好像要包起来了 iOS 我的问题。 哪一个是正确的?我没有应用任何变换,只应用了一个使绘制的四边形稍微后退的变换。glTranslatef(0.0f,0.0f,-5.f) 初始化代码: glEnable(GL_TEXTURE_2D);

我刚刚开始使用opengl es为我的跨平台框架(iOS和Android)开发渲染器。当我谈到viewport的东西时(这是splitscreen的东西所需要的),我注意到iOS和Android之间存在差异。这里有两张图片

Android 实际上还有一个小故障。好像要包起来了

iOS

我的问题。 哪一个是正确的?我没有应用任何变换,只应用了一个使绘制的四边形稍微后退的变换。glTranslatef(0.0f,0.0f,-5.f)

初始化代码:

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);            //Enable Smooth Shading
glClearColor(0.f, 0.f, 0.f, 1.0f);  //Black Background
glClearDepthf(1.0f);                    //Depth Buffer Setup
glEnable(GL_DEPTH_TEST);            //Enables Depth Testing
glDepthFunc(GL_LEQUAL);             //The Type Of Depth Testing To Do

//Really Nice Perspective Calculations
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
视口和项目代码

glViewport(viewportX, viewportY, viewportW, viewportH);.

glEnable(GL_SCISSOR_TEST);
glScissor(viewportX, viewportY, viewportW, viewportH);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
。。。最后计算并设置平截面积。 我还使用了以下代码:

float widthH = width * .1f;
float heightH = height * .1f;
glOrthof(-widthH, widthH, -heightH, heightH, .1f, 100.f);
glScalef(widthH, heightH, 1.f);

也许安卓或iOS有一些默认设置?我不知道。

这看起来你没有考虑iOS设备的比例因子。请记住,最新的iOS设备的视网膜显示具有极高的ppi。你可以在iOS屏幕截图的左下角看到这个工件。它仅显示纹理的底部25%,因为整个视图的比例因子为2


简言之,请确保您在iOS上考虑了
scaleFactor
,并在您的
glScalef
通话中使用此因素。

为有相同问题的人回答我自己的问题


我使用GLKView,它显然在每次渲染调用时调用glViewport,重置我刚才在前一帧中所做的操作。因此,如果使用GLKView,请确保在每个帧中调用glViewport。。。或者滚动你自己的EagleView来进行一些真正的控制,我想,我即将进行。

我使用的是没有视网膜显示的iPhone模拟器。iOS版本看起来与我的应用程序版本完全相同,视口为(1,1)。我将添加全屏视口的图像。四边形仍然以屏幕为中心,而不是像android版本那样以视口为中心。缩放无法解决这个问题。模拟器将伪装成视网膜屏幕。这个问题显然是一个规模问题。仔细检查这两个图形,发现iOS版本的比例为+200%。非常奇怪。我也在使用剪刀测试,哪种测试隐藏了真正的问题。glViewport根本不起作用,至少在我使用它的地方不起作用。它现在运行良好。仍然有一些明确的问题,但我会尽快解决。还是要感谢你指出缩放的东西。因为iOS给了我480320的尺寸,甚至连视网膜都开着。这是一个问题。事情是这样的。当我不考虑视网膜时,东西就变小了。似乎我应该用别的方法来获得正确的解决方案。。。或者自己把它们放大。self.view.bounds.size.width、self.view.bounds.size.height确保没有问题。我认为在代码中执行乘法当然是一种选择,但我相信还有更好的选择。查看此链接,您可能会找到您想要的内容。