2011-08-18 85 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來動態獲取當前屏幕的比例。