簡體   English   中英

用於視網膜顯示的OpenGL ES 2.0紋理?

[英]OpenGL ES 2.0 textures for retina display?

我有一個GLKView,我嘗試在其中繪制幾個多維數據集,並從視圖中創建紋理並將其映射到多維數據集。 但是,當我在視網膜設備上啟動該應用程序時,紋理的大小正確,但看起來很糟糕。 我試圖將GLKView的contentScaleFactor設置為主屏幕的比例-無濟於事。 我還嘗試將緩沖區的尺寸乘以比例尺,從而使紋理看起來清晰,但僅為原始尺寸的1/4 ...

事不宜遲,我可以向您介紹我所做的事情(沒有上面指出的乘法):

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);

這個問題的答案可以在這里找到

如何創建一個CGBitmapContext用於視網膜顯示並且不浪費空間用於常規顯示?

我基本上所做的就是將紋理和緩沖區乘以屏幕的比例因子,因為這只能產生大小的1/4的紋理,所以我也必須將上下文乘以比例因子

CGContextScaleCTM(context, scaleFactor, scaleFactor);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM