2011-08-18 87 views
2

这可能与我的another unsolved mystery有关。iPhone上的OpenGL ES可能会导致视网膜问题?

我在iPhone上绘制Orthographic 2d,使用真实设备和模拟器。我试图给我的像素着色一个给定的颜色,这取决于它们距'A'的像素空间中的任意点有多远,我通过(硬代码)。我在做Retina 960x640分辨率的一切。我计算从A到gl_FragCoord的距离,并且我基于两种颜色之间的跳跃着色,'最大'距离为300px。

当在模拟器(有视网膜显示)时,我需要为屏幕中点X给出一个“460”像素的中心点.. YI给出160px,并且我寻找距离'300'px ..得到设备上的相同效果我需要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];

回答

2

你不应该硬编码 “glViewport(0,0,960.0f,640.0f);”,设置视口是这样的:

glViewport(0, 0, framebufferWidth, framebufferHeight); 

也不要硬编码内容的规模,你可以findout与内容规模:

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

关于像素的距离,因为你想要的距离是双带Retina显示屏,你可以添加均匀,与内容规模着色器。

+0

我已经用正确的通用值代替了那些 - 但是我非常清楚地知道问题不在那里。仔细看看我的iPhone 4设备上的Q-retina显示屏和模拟器上的“retina”iPhone设备的行为有所不同 – Nektarios

0

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