簡體   English   中英

為OpenGL ES設置CAEAGLLayer屬性?

[英]setting a CAEAGLLayer properties for OpenGL ES?

根據蘋果的《 iOS OpenGL ES編程指南》,使用幀緩沖區對象在iOS上進行渲染(這似乎是蘋果在iOS上的首選渲染方式),應該使用glRenderbufferStorage()根據OpenGL指定寬度和高度等屬性Munshi,Ginsburg和Shreiner的ES 2.0編程指南。 蘋果將​​其替換為上述指南中發送到EAGLContext的renderbufferStorage:fromDrawable:消息。

然后,Apple繼續從Renderbuffer讀取寬度和高度,因為該緩沖區在創建時將它們設置為沒有進一步的細節。

寬度和高度均為0。

CAEAGLLayer類參考寫道:“設置層邊界以匹配顯示的尺寸”。 CAEAGLLayer類是Apple希望將其用作視圖使用的支持類的類。 這是通過從視圖layerClass方法返回它來完成的。 此CAEAGLLayer僅具有1個屬性“ drawableProperties”,它是一個NSDictionary。 不幸的是,文檔很少。 無法設置尺寸。

因此:如何繼續為OpenGL ES設置CAEAGLLayer屬性?

到目前為止,這是我的代碼(請注意,Apple的一個舊示例使用initWithCoder,我猜到了或者從一個我不記得使用initWithFrame的地方得到):

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code
        theCAEAGLLayer = (CAEAGLLayer*)self.layer;
        theCAEAGLLayer.opaque = YES;
        theEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        [EAGLContext setCurrentContext:theEAGLContext];
        glGenFramebuffers(1, &theFramebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, theFramebuffer);
        glGenRenderbuffers(1, &theColorRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, theColorRenderbuffer);
        [theEAGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:theCAEAGLLayer];
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, theColorRenderbuffer);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &widthOfTheColorRenderbuffer);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &heightOfTheColorRenderbuffer);
        glGenRenderbuffers(1, &theDepthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, theDepthRenderbuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, widthOfTheColorRenderbuffer, heightOfTheColorRenderbuffer);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, theDepthRenderbuffer);
        if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        {

        }
    }
    return self;
}

正確答案:

UIKit將某些操作分批處理,並將其推遲到運行循環的后面。 那是因為您可能擁有更改視圖大小並更改其中不同文本位的代碼。 您可能希望這些事情原子發生。

對您來說可能意味着該圖層尚未調整大小。 您是否嘗試過將要移動的內容- (void)layoutSubviews

如果您打算僅將iOS 5作為目標,則可以使用GLKView並避免自己編寫任何此類內容。

其他的建議:

glRenderbufferStorage將在OpenGL可以繪制到的不透明位置創建存儲,但是OS應該如何猜測您要向用戶顯示的幀緩沖區中的哪一個,而不只是一個中間結果? OpenGL規范沒有明確定義如何與特定的操作系統進行通信。 在iOS中,它是通過renderbufferStorage:fromDrawable:來實現的,它表示要添加相當於iOS知道如何組合的CALayer存儲。 Apple的方法不能替代glRenderbufferStorage ,它可以做glRenderbufferStorage不能也不應做的事情, glRenderbufferStorage即使只為iOS編程,也有很多次使用它。

- (id)initWithFrame:是手動創建視圖時要使用的初始化程序。 - (id)initWithCoder:系統用於從NIB加載視圖。

您的UIView是否已將其layerClass明確指定為CAEAGLLayer 如果不是這樣,則對您的EAGL上下文的調用將被允許失敗。

暫無
暫無

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

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