gpt4 book ai didi

ios - iOS 中的 OpenGL ES 2.0 和默认 FrameBuffer

转载 作者:可可西里 更新时间:2023-11-01 05:03:57 24 4
gpt4 key购买 nike

我对 FrameBuffers 有点困惑。目前,为了在屏幕上绘制,我使用此代码为 GL_COLOR_ATTACHMENT0 生成了一个带有 Renderbuffer 的帧缓冲区。

-(void)initializeBuffers{

//Build the main FrameBuffer
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

//Build the color Buffer
glGenRenderbuffers(1, &colorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);

//setup the color buffer with the EAGLLayer (it automatically defines width and height of the buffer)
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &bufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &bufferHeight);

//Attach the colorbuffer to the framebuffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);

//Check the Framebuffer status
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

NSAssert(status == GL_FRAMEBUFFER_COMPLETE, ERROR_FRAMEBUFFER_FAIL);

}

然后我使用

显示缓冲区内容
[context presentRenderbuffer:GL_RENDERBUFFER];

阅读 this question ,我看到了 Arttu Peltonen 的评论,他说:

Default framebuffer is where you render to by default, you don't have to do anything to get that. Framebuffer objects are what you can render to instead, and that's called "off-screen rendering" by some. If you do that, you end up with your image in a texture instead of the default framebuffer (that gets displayed on-screen). You can copy the image from that texture to the default framebuffer (on-screen), that's usually done with blitting (but it's only available in OpenGL ES 3.0). But if you only wanted to show the image on-screen, you probably wouldn't use a FBO in the first place.

所以我在想我的方法是不是只是为了离屏渲染用的。在那种情况下,我必须做什么才能在默认缓冲区上渲染?!(注意,我不想使用 GLKView...)

最佳答案

OpenGL ES 规范提供了两种帧缓冲区:窗口系统提供的和帧缓冲区对象。默认的帧缓冲区将是窗口系统提供的那种。但该规范并不要求存在窗口系统提供的帧缓冲区或默认帧缓冲区。

在 iOS 中,没有窗口系统提供的帧缓冲区,也没有默认的帧缓冲区——所有的绘制都是用帧缓冲区对象完成的。要渲染到屏幕,您需要创建一个渲染缓冲区,其存储来自 CAEAGLLayer 对象(或者您使用代表您创建的对象,就像使用 GLKView 类时一样)。这正是您的代码所做的。

要进行离屏渲染,您需要创建一个渲染缓冲区并调用 glRenderbufferStorage 为其分配存储空间。所述存储不与 CAEAGLLayer 相关联,因此渲染缓冲区不能(直接)呈现在屏幕上。 (它也不是纹理——将纹理设置为渲染目标的工作方式不同——它只是一个屏幕外缓冲区。)

在 Apple 的 OpenGL ES Programming Guide for iOS 中有关于所有这些和每种方法的示例代码的更多信息。 .

关于ios - iOS 中的 OpenGL ES 2.0 和默认 FrameBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19662413/

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