繁体   English   中英

iOS GLKit并返回默认的帧缓冲

[英]iOS GLKit and back to default framebuffer

我正在运行XCode为iOS的OpenGL项目创建的样板OpenGL示例代码。 这将设置一个简单的ViewController并使用GLKit来处理其余的工作。

该应用程序的所有更新/绘图功能都在C ++中。 它是跨平台的。

正在进行许多帧缓冲创建。 绘制阶段渲染到一些帧缓冲区,然后尝试将其设置回默认的帧缓冲区。

glBindFramebuffer(GL_FRAMEBUFFER, 0);

这将生成GL_INVALID_ENUM。 仅在iOS上。

我完全为为什么感到困惑。 该代码可以在除iOS之外的所有主要平台上正常运行。 我要怪GLKit。 不使用GLKit的iOS OpenGL设置的任何示例?

UPDATE

下面的代码片段让我看到了GLKit使用的默认帧缓冲区。 由于某些原因,它显示为“ 2”。 当然,如果我在所有glBindFrameBuffer调用中都使用“ 2”,它将起作用。 这非常令人沮丧。

[view bindDrawable ];

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
LOGI("DEFAULT FBO: %d", defaultFBO);  

究竟是什么原因会导致GLKit无法在0生成其内部帧缓冲区? 这是OpenGL使用的其他所有语义,0是默认的FBO。

在iOS上,没有默认的帧缓冲区。 请参阅帧缓冲对象是iOS上的唯一渲染目标 我对GLKit不太了解,但是在iOS上要在屏幕上渲染某些内容,您需要创建帧缓冲区,并将其附加到renderbuffer,并通知Core Animation Layer该渲染缓冲区将是绘制的“屏幕”或“默认帧缓冲区”至。 含义-您要绘制到此帧缓冲区的所有内容都会显示在屏幕上。 请参见渲染到核心动画层

我觉得有必要在这里指出对glBindFramebuffer(GL_FRAMEBUFFER,0)的调用; 尽管它似乎适用于运行Windows,Unix(Mac)或Linux的计算机,但它不会将渲染返回到主帧缓冲区。 台式机和笔记本电脑没有主默认系统缓冲区的概念。 这个想法始于手持设备。 当您使用零作为参数进行openGL绑定调用时,您正在做的就是将此函数设置为NULL。 这是禁用此功能的方法。 与glBindTexture(GL_TEXTURE_2D,0)相同; 在某些手持设备上,当您将帧缓冲区设置为NULL而不激活另一个时,驱动程序可能会自动激活主系统帧缓冲区。 这将是制造商的选择,而不是您应该依靠的东西,这也不属于openGL ES规范。 对于台式机和笔记本电脑,这是绝对必要的,因为需要禁用帧缓冲区才能返回正常的openGL渲染。

在iOS设备上,您应该进行以下调用glBindFramebuffer(GL_FRAMEBUFFER,viewFramebuffer);,前提是您将系统帧缓冲区命名为“ viewFramebuffer”。 在初始化代码中查找以下调用glGenFramebuffers(1,&viewFramebuffer);。 无论最后写的是什么,返回主系统缓冲区时都绑定了什么。

如果使用的是GLKit,则可以使用以下调用:[[((GLKView *)self.view)bindDrawable]; “ self.view”可能会有所不同,具体取决于您的特定启动代码。
另外,对于iOS,您可以使用glBindFramebuffer(GL_FRAMEBUFFER,2); 但这在Apple未来发布的设备中可能并不一致。 他们可能会将默认值“ 2”更改为“ 3”或将来的其他名称,因此您希望使用实际名称而不是整数值。

  • (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

//使用辅助/离屏帧缓冲区存储渲染结果

    [self.shader drawOffscreenOnFBO];

//返回到GLKView的默认帧缓冲区

    [((GLKView *) self.view) bindDrawable];

//在主屏幕上绘制[self.shader drawinmainscreen];

}

Refernece ..... http://districtf13.blogspot.com/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM