iPhone上的OpenGL ES可能出现Retina问题?

这可能与我的另一个未解之谜有关。

我正在使用真实设备和模拟器在iPhone上绘制Orthographic 2d。 我试图给我的像素着色一个给定的颜色取决于它们与’A’的像素空间中的任意点的距离,我传入(硬编码)。 我正在做Retina 960×640分辨率的一切。 我计算从A到gl_FragCoord距离,我根据2种颜色之间的跳跃进行着色,其中“max”是300px距离。

当在模拟器上(带有视网膜显示器)时,我需要为屏幕中点X给出一个“460”像素的中心点.YI给出160px,我寻找’300’px的距离..以便在设备I上获得相同的效果需要960X的中心和150的距离才能得到相同的结果(有趣的是,px 80并没有给出我想要的相同结果,但160可能是原始的超调…)

显然,视网膜问题正在发挥作用。 但是我在哪里,如何以及如何找到并修复它?

我在用着:

glViewport(0, 0, 960.0f, 640.0f);

和:

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

和:

[self setView:[[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds]];
[(EAGLView *)[self view] setContentScaleFactor:2.0f];

你不应该硬编码“glViewport(0,0,960.0f,640.0f);”,以这种方式设置视口:

 glViewport(0, 0, framebufferWidth, framebufferHeight); 

也不要硬编码内容比例,你可以找到内容比例:

 float contentScale = 1.0f; if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { contentScale = [[UIScreen mainScreen] scale]; } 

关于像素距离,因为您希望距离是视网膜显示的双倍,您可以使用内容比例为着色器添加制服。

现在iOS设备可以有多个不同的屏幕, UIWindow可以放在非主屏幕上。 在这种情况下,您可以使用self.view.window.screen.scale动态获取当前屏幕的比例。