gpt4 book ai didi

c++ - 如何在c++ opengles ios中取消绑定(bind)glBindFramebuffer

转载 作者:行者123 更新时间:2023-11-29 05:38:39 31 4
gpt4 key购买 nike

我正在将一个在Windows和Android上运行的程序移植到iOS上。以下代码在两个平台上都有效,但在 ios 上,它在执行该代码后停止渲染,我怀疑绑定(bind)永远不会解除绑定(bind),正确的方法是什么?

代码的目标是获取纹理像素。

这是代码:

void Texture::Bind()
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, mTextureID);
}

GLubyte* Texture::GetPixels()
{
Bind();

int data_size = mWidth * mHeight * 4;

GLubyte* pixels = new GLubyte[data_size];
#ifdef _WIN32
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
#else
GLuint fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureID, 0);

glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fbo);
#endif
return pixels;
}

最佳答案

iOS 不适用于索引为 0 的默认帧缓冲区。您需要绑定(bind)用作主缓冲区的缓冲区。这取决于您使用的工具,但如果您直接使用 UIView 那么您应该找到一些类似于以下内容的代码:

- (instancetype)initWithView:(UIView *)view {

if((self = [super init])) {
{
GLuint bufferID = 0;
glGenFramebuffers(1, &bufferID);
glBindFramebuffer(GL_FRAMEBUFFER, bufferID);
self.frameBufferID = bufferID;
}
{
GLuint bufferID = 0;
glGenRenderbuffers(1, &bufferID);
glBindRenderbuffer(GL_RENDERBUFFER, bufferID);
view.layer.contentsScale = UIScreen.mainScreen.scale;
[[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)view.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, bufferID);
self.colorBufferID = bufferID;

GLint width, height;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);

self.bufferWidth = width;
self.bufferHeight = height;
}
}
return self;

}

您正在寻找对 renderbufferStorage:fromDrawable: 的调用。在它附近应该创建一个与该渲染缓冲区关联的帧缓冲区。该帧缓冲区的 id 就是您需要绑定(bind)的内容。

因此,在上面的片段中,您将使用 self.frameBufferID

至于我发布的代码片段,它是一个项目的一部分,该项目从给定的 UIView 生成帧和渲染缓冲区。首先它生成帧缓冲区并绑定(bind)它。创建并绑定(bind)下一个渲染缓冲区。然后通过 native iOS 代码和层设置渲染缓冲区。我们将渲染缓冲区附加到帧缓冲区。最后提取宽度和高度。

在绘制到该对象之前,调用以下 bind 方法:

- (void)bind {
glBindFramebuffer(GL_FRAMEBUFFER, self.frameBufferID);
glBindRenderbuffer(GL_RENDERBUFFER, self.colorBufferID);
}

关于c++ - 如何在c++ opengles ios中取消绑定(bind)glBindFramebuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56786676/

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