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

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_);

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

#1楼 票数:4

你是对的,你不能将纹理和渲染缓冲区附加到同一个连接点,以自动渲染到两者。

只需将其渲染到纹理,然后在屏幕上绘制一个屏幕大小的纹理四边形来显示它。 当然,请记住在渲染时将纹理解除绑定( glBindTexture(GL_TEXTURE_2D, 0) ),此时您不会。

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

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

  ask by Siarhei Fedartsou translate from so

未解决问题?本站智能推荐:

1回复

分别渲染到多样本缓冲区和解析的帧缓冲区

因此,我使用GL_LINE_STRIP做一些图形绘制,并且我使用的是多采样缓冲区,因此线条看起来不那么锯齿。 问题是我在图的背景中有一些线条充当图例。 多采样类型的螺钉将线排列成一排,导致它们的厚度恰好为1像素,但是由于多次采样,有时会将线分布在2个像素上,这些像素比原始颜色稍微暗一些,从而
1回复

除了使用支持CoreAnimation的渲染缓冲区之外,还有其他显示OpenGL内容的方法吗?

根据Apple的OpenGL ES编程指南 ,“如果要向用户显示[a]帧缓冲区,请使用支持Core Animation的特殊渲染缓冲区。” 文本继续说,要使此Core Animation感知渲染缓冲区,需要使用以下代码“对UIView进行子类化,以为iOS应用程序[和]覆盖layerClas
1回复

将GLESpng纹理渲染为黑色

我只是想将全屏.png绘制为openGL作为纹理。 但是,我遇到了黑屏。 我的代码可以与jpeg一起正常工作,因此我只能假定这是透明度问题。 这是一个示例png,它不适用于: http : //cl.ly/e5x4 (尽管它是不透明的,但仍然无法渲染)(不,它必须是.png) 这是我
1回复

iOS将对象渲染为纹理

我目前正在尝试将OpenGL ES 2.0绘制过程分为两半:前半部分将感兴趣的对象(即立方体或三角形)渲染到附着有纹理的帧缓冲区,后半部分将我将该纹理应用于另一个帧缓冲区(即另一个立方体或三角形)中绘制的形状的表面。 我清除了绑定到具有绿色纹理的帧缓冲区,并且已经能够使该颜色显示在我在另一个
4回复

OpenGLES2.0渲染到纹理

我正在尝试使用OpenGL ES 2.0渲染到纹理,但我似乎无法使其工作。 这就是我的进展方式: 但是当我尝试使用它并使用生成的纹理时,纹理被绘制为完全黑色。 如果我只是不将绘图代码包装在render_tex->begin(); 和render_tex->end();
1回复

OpenGLES2.0渲染为多种纹理

我正在使用OpenGL ES 2.0构建iPad应用程序。 我需要做的是渲染到多个纹理,然后渲染所有纹理以供查看。 我根据用户触摸位置使用GL_POINTS进行绘制。 我现在拥有的代码是: 生成帧缓冲区,纹理和渲染缓冲区: 画: 上面的工作正常,但是当我想渲染为新纹理时,我的应
1回复

从FBO渲染到纹理会导致模糊

我正在尝试在iOS上使用OpenGL ES2创建照片编辑程序。 我希望能够使用片段着色器修改照片的某些部分。 例如,如果用户触摸屏幕,则该点将被发送到片段着色器。 片段着色器将在该点的特定半径内添加效果。 我需要的是将片段着色器中所做的修改保留到下一帧。 我已经读到,执行此操作的方法
1回复

在iOS上将CIImage渲染为OpenGLES2.0纹理

有人知道如何通过drawImage将CIImage直接渲染到OpenGL ES 2.0纹理中:inRect:fromRect:来自iOS上的EAGL CIContext吗? 通过createCGImage:fromRect通过普通的CIContext渲染:然后通过GLKTextureLoade