![](/img/trans.png)
[英]Best way to flip a CAEAGLLayer for presentation in OpenGL ES 2
[英]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.