gpt4 book ai didi

ios - 如何使用 openGL 上下文 : Current draw framebuffer is invalid 设置 CAEAGLLayer 子类

转载 作者:可可西里 更新时间:2023-11-01 06:10:17 25 4
gpt4 key购买 nike

我正在尝试使用 gl 上下文设置 CAEAGLLayer 子类。也就是说,我不是创建返回 CAEAGLLayer 的 UIView 子类,而是从 UIView 子类中将 gl 上下文绑定(bind)到该层,而是直接子类化该层并尝试在该层的初始化中设置上下文,如下所示:

- (id)init
{
self = [super init];
if (self) {
self.opaque = YES;

_glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
NSAssert([EAGLContext setCurrentContext:_glContext], @"");

glGenRenderbuffers(1, &_colorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:self];

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer);

/// . . .

到目前为止,一切似乎都很好。但是,然后我尝试创建一个带有“直通”顶点/片段着色器对的着色器程序,虽然链接程序未返回任何错误,但验证失败并显示:“当前绘制帧缓冲区无效。”

链接和验证着色器程序的代码(在附加着色器之后)看起来像这样,以防万一:

- (BOOL)linkAndValidateProgram
{
GLint status;
glLinkProgram(_shaderProgram);

#ifdef DEBUG
GLint infoLogLength;
GLchar *infoLog = NULL;
glGetProgramiv(_shaderProgram, GL_INFO_LOG_LENGTH, &infoLogLength);
if (infoLogLength > 0) {
infoLog = (GLchar *)malloc(infoLogLength);
glGetProgramInfoLog(_shaderProgram, infoLogLength, &infoLogLength, infoLog);
NSLog(@"Program link log:\n%s", infoLog);
free(infoLog);
}
#endif

glGetProgramiv(_shaderProgram, GL_LINK_STATUS, &status);
if (!status) {
return NO;
}

glValidateProgram(_shaderProgram);

#ifdef DEBUG
glGetProgramiv(_shaderProgram, GL_INFO_LOG_LENGTH, &infoLogLength);
if (infoLogLength > 0) {
infoLog = (GLchar *)malloc(infoLogLength);
glGetProgramInfoLog(_shaderProgram, infoLogLength, &infoLogLength, infoLog);
NSLog(@"Program validation log:\n%s", infoLog);
free(infoLog);
}
#endif

glGetProgramiv(_shaderProgram, GL_VALIDATE_STATUS, &status);
if (!status) {
return NO;
}

glUseProgram(_shaderProgram);
return YES;
}

我想知道在 CAEAGLLayer 的整个生命周期的某个时刻是否有一些额外的设置我可能没有意识到并且可能会通过尝试在 init 中设置 GL 而跳过?

最佳答案

问题是层在初始化时没有维度。这反过来又使得它试图将渲染缓冲区存储设置为图层意味着缓冲区为 0。

更新:我目前最好的想法是,与其在 init 上强加一个大小(这对于测试目的来说工作正常但有点 hacky),我应该只要重新设置缓冲区存储该层改变大小。所以我重写 -setBounds: 像这样:

- (void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:self];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &someVariableToHoldWidthIfYouNeedIt);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &someVariableToHoldHeightIfYouNeedIt);
}

关于ios - 如何使用 openGL 上下文 : Current draw framebuffer is invalid 设置 CAEAGLLayer 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18135736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com