gpt4 book ai didi

ios - 同时渲染到纹理和渲染到渲染缓冲区

转载 作者:行者123 更新时间:2023-12-01 18:27:08 26 4
gpt4 key购买 nike

我使用这样的代码来设置我的帧缓冲区:

glGenRenderbuffers(1, &colorBuffer_) ;

glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer_);

if (!colorBuffer_)
{
NSLog(@"glGenRenderbuffers() failed");
break;
}

[self.context renderbufferStorage:GL_RENDERBUFFER fromDrawable:drawable_];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width_);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height_);

glGenFramebuffers(1, &fbo);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

if (!fbo)
{
NSLog(@"glGenFramebuffers() failed");
break;
}

CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, self.context, NULL, &textureCache_);
if (err)
{
NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err);
}
CFDictionaryRef empty; // empty value for attr value.
CFMutableDictionaryRef attrs;
empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary
NULL,
NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
attrs = CFDictionaryCreateMutable(kCFAllocatorDefault,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);

CFDictionarySetValue(attrs,
kCVPixelBufferIOSurfacePropertiesKey,
empty);

CVPixelBufferCreate(kCFAllocatorDefault,
(int)width_,
(int)height_,
kCVPixelFormatType_32BGRA,
attrs,
&renderTarget_);

err = CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
textureCache_, renderTarget_,
NULL, // texture attributes
GL_TEXTURE_2D,
GL_RGBA, // opengl format
(int)width_,
(int)height_,
GL_BGRA, // native iOS format
GL_UNSIGNED_BYTE,
0,
&renderTexture_);
if (err)
{
NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err);
}

CFRelease(attrs);
CFRelease(empty);

glBindTexture(CVOpenGLESTextureGetTarget(renderTexture_), CVOpenGLESTextureGetName(renderTexture_));
checkForErrors();

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

NSLog(@"%u", CVOpenGLESTextureGetName(renderTexture_));

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture_), 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer_);

我想同时渲染到纹理和渲染到渲染缓冲区(在屏幕上查看渲染结果)。但是这段代码不起作用。我认为我不能使用 glFramebufferTexture2DglFramebufferRenderbuffer同时。我对吗?我该怎么做?

最佳答案

您是对的,因为您不能将纹理和渲染缓冲区都附加到同一个附加点以自动渲染到两者中。

只需将其渲染到纹理,然后在屏幕上绘制一个屏幕大小的纹理四边形以显示它。当然,请记住在渲染到纹理时取消绑定(bind)纹理 (glBindTexture(GL_TEXTURE_2D, 0)),目前您不需要。

或者通过像往常一样将结果渲染到屏幕并使用 glCopyTexSubImage2D 将这些结果复制到纹理中来做相反的事情。 .但最终你不会绕过副本,无论是间接地以绘制纹理四边形或直接帧缓冲区到纹理副本的形式。

编辑:您也可以使用多个渲染目标来解决此问题,方法是将纹理和渲染缓冲区附加到不同的颜色附件,并在片段着色器的多个 channel 上输出相同的结果颜色(使用 gl_FragData[i] 而不是 gl_FragColor )。但我不确定这是否真的能给你带来任何好处,而且它要求你的着色器知道双重渲染。最后我不确定 ES 是否真的支持多个渲染目标。

关于ios - 同时渲染到纹理和渲染到渲染缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12459519/

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