2013-06-29 57 views
1

我有一個GLKView,我嘗試繪製幾個立方體,並從視圖創建紋理並將它們映射到立方體上。但是,當我在視網膜設備上啓動應用程序時,紋理的大小正確,但看起來很糟糕。我試圖將GLKView的contentScaleFactor設置爲主屏幕的比例 - 無濟於事。我也試圖用尺度乘以緩衝區的尺寸,導致紋理看起來很脆,但只有原始尺寸的1/4 ...用於視網膜顯示的OpenGL ES 2.0紋理?

不用再說了,我可以向你展示我所擁有的DONE(沒有上面所指出的乘法):

GLKView

- (void)setupGL { 

    UIScreen *mainScreen = [UIScreen mainScreen]; 
    const CGFloat scale = mainScreen.scale; 
    self.contentScaleFactor = scale; 
    self.layer.contentsScale = scale; 

    glGenFramebuffers(1, &defaultFrameBuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFrameBuffer); 

    glGenRenderbuffers(1, &depthBuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); 

    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.bounds.size.width, self.bounds.size.height); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); 

    glGenRenderbuffers(1, &colorBuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, self.bounds.size.width, self.bounds.size.height); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ARRAY, GL_RENDERBUFFER, colorBuffer); 

    glEnable(GL_DEPTH_TEST); 

} 

這裏我加載紋理

// make space for an RGBA image of the view 
GLubyte *pixelBuffer = (GLubyte *)malloc(
             4 * 
             cV.bounds.size.width * 
             cV.bounds.size.height); 

// create a suitable CoreGraphics context 
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = 
CGBitmapContextCreate(pixelBuffer, 
         cV.bounds.size.width, cV.bounds.size.height, 
         8, 4*cV.bounds.size.width, 
         colourSpace, 
         kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(colourSpace); 

// draw the view to the buffer 
[cV.layer renderInContext:context]; 

// upload to OpenGL 
glTexImage2D(GL_TEXTURE_2D, 0, 
      GL_RGBA, 
      cV.bounds.size.width, cV.bounds.size.height, 0, 
      GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer); 



glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

回答