菜鸟教程小白 发表于 2022-12-13 02:14:32

ios - 在 CADisplayLink 渲染循环中绑定(bind) EAGLDrawable 失败


                                            <p><p>我使用 CADisplayLink 渲染循环回调来渲染一系列带有 openGLes 的图像纹理。
在调用 CADisplayLink 的第一个回调后,我得到了这些错误输出</p>

<pre><code>Failed to bind EAGLDrawable: &lt;CAEAGLLayer: 0x946bb40&gt; 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, &amp;_frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);

    glGenRenderbuffers(1, &amp;_renderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
    ;
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER, _renderBuffer);

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &amp;_renderWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &amp;_renderHeight);

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
      NSLog(@&#34;AAfailed to make complete framebuffer object %x&#34;, glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
    glGenBuffers(1,&amp;_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&amp;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, &amp;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, &amp;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]
查看完整版本: ios - 在 CADisplayLink 渲染循环中绑定(bind) EAGLDrawable 失败