ios - 在 CADisplayLink 渲染循环中绑定(bind) EAGLDrawable 失败
<p><p>我使用 CADisplayLink 渲染循环回调来渲染一系列带有 openGLes 的图像纹理。
在调用 CADisplayLink 的第一个回调后,我得到了这些错误输出</p>
<pre><code>Failed to bind EAGLDrawable: <CAEAGLLayer: 0x946bb40> to GL_RENDERBUFFER 2
Failed to make complete framebuffer object 8cd6
</code></pre>
<p>我在controller的viewDidLoad阶段设置了renderBuffer&frameBuffer并调用glFramebufferRenderbuffer,glCheckFramebufferStatus的返回在那个阶段就可以了。</p>
<p>这是我正在使用的代码。</p>
<pre><code>//GLKViewController.m
typedef struct {
GLKVector3positionCoords;
GLKVector2textureCoords;
}SceneVertex;
static const SceneVertex vertices[] =
{
{{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f}}, // lower left corner
{{ 1.0f, -1.0f, 0.0f}, {1.0f, 0.0f}}, // lower right corner
{{-1.0f,1.0f, 0.0f}, {0.0f, 1.0f}}, // upper left corner
{{ 1.0f,1.0f, 0.0f}, {1.0f, 1.0f}},
};
@interface myViewController ()//glkViewController
@property (nonatomic) GLuint renderBuffer;
@property (nonatomic) GLuint frameBuffer;
@property (nonatomic) GLuint glBuffer;
@property (nonatomic) int renderWidth;
@property (nonatomic) int renderHeight;
@property(strong, nonatomic) CADisplayLink* displayLink;
@property(strong, nonatomic) EAGLContext* context;
@end
@implementation myViewController
-(void)setupBuffers
{
glGenFramebuffers(1, &_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
glGenRenderbuffers(1, &_renderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
;
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, _renderBuffer);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_renderWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_renderHeight);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
NSLog(@"AAfailed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
glGenBuffers(1,&_glBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _glBuffer);
glBufferData(
GL_ARRAY_BUFFER, // Initialize buffer contents
sizeof(vertices),// Number of bytes to copy
vertices, // Address of bytes to copy
GL_STATIC_DRAW); // Hint: cache in GPU memory
}
-(void)loadView
{
_context = [ initWithAPI:kEAGLRenderingAPIOpenGLES2];
self.view= [ initWithFrame:[ bounds] context:_context];
}
- (void)viewDidLoad
{
;
;
;
_displayLink = ;
forMode:NSDefaultRunLoopMode];
_displayLink.frameInterval = 1;
}
- (void)render
{
myView *view = (myView*)self.view;
NSData *image = ; //if nil, return or sleep&reget;
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, _renderWidth, _renderHeight);
GLuint texture = -1;
glGenTextures(1, &texture);
glActiveTexture(GL_TEXTURE0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D(
GL_TEXTURE_2D, 0, /* target, level */
GL_RGB, /* internal format */
_renderWidth, _renderHeight, 0, /* width, height, border */
GL_RGB, GL_UNSIGNED_BYTE, /* external format, type */
image.bytes /* pixels */
);
glBindBuffer(GL_ARRAY_BUFFER,_glBuffer);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, // Identifies the attribute to use
3, // number of coordinates for attribute
GL_FLOAT, // data is floating point
GL_FALSE, // no fixed point scaling
sizeof(SceneVertex), // total num bytes stored
NULL+offsetof(SceneVertex, positionCoords));
glBindBuffer(GL_ARRAY_BUFFER, _glBuffer);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, // Identifies the attribute to use
2, // number of coordinates for attribute
GL_FLOAT, // data is floating point
GL_FALSE, // no fixed point scaling
sizeof(SceneVertex), // total num bytes stored per vertex
NULL+offsetof(SceneVertex, textureCoords));
glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawArrays(GL_TRIANGLES, 1, 4);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
;
glFlush();
glDeleteTextures(1, &texture);
}
@end
//GLKView
@implementation myView
+ (Class)layerClass {
return ;
}
- (id)initWithFrame:(CGRect)frame context:(EAGLContext *)context
{
self = ;
if (self) {
self.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
self.context = context;
CAEAGLLayer *layer= (CAEAGLLayer *)self.layer;
self.images = [ init];
layer.opaque = YES;
layer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
, kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
}
return self;
}
@end
//APPDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [ initWithFrame:[ bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = ;
self.window.rootViewController = [init];
;
return YES;
}
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>当您尝试绘制当前不在屏幕上的 openGLView 时会发生这种情况。在我的例子中,我的 Storyboard中的当前尺寸类中没有安装 View 。</p>
<p>如果您使用 Storyboard,请仔细检查 View 是否安装在当前大小类中</p>
<ol>
<li>在 Storyboard 中选择打开的 GLView </li>
<li>转到属性检查器</li>
</ol>
<p> <a href="/image/qyFjX.png" rel="noreferrer noopener nofollow"><img src="/image/qyFjX.png" alt="enter image description here"/></a> </p>
<ol 开始=“3”>
<li>验证 View 是否安装在所有尺寸类别中,如下所示</li>
</ol>
<p> <a href="/image/tZc7J.png" rel="noreferrer noopener nofollow"><img src="/image/tZc7J.png" alt="enter image description here"/></a> </p></p>
<p style="font-size: 20px;">关于ios - 在 CADisplayLink 渲染循环中绑定(bind) EAGLDrawable 失败,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/26039275/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/26039275/
</a>
</p>
页:
[1]