1

このようなコードを使用して、フレームバッファーをセットアップします。

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

テクスチャへのレンダリングとレンダリング バッファへのレンダリング (画面でレンダリングの結果を確認するため) を同時に行いたいと考えています。しかし、このコードは機能していません。同時に使えないglFramebufferTexture2Dと思います。glFramebufferRenderbuffer私は正しいですか?どうすればできますか?

4

1 に答える 1

4

テクスチャとレンダー バッファーの両方を同じアタッチ ポイントにアタッチして、両方に自動的にレンダリングすることはできません。

それをテクスチャにレンダリングしてから、画面サイズのテクスチャ付きクワッドを画面に描画して表示します。そしてもちろん、glBindTexture(GL_TEXTURE_2D, 0)レンダリング中にテクスチャ ( ) をアンバインドすることを忘れないでください。現時点ではそうしません。

または、通常どおり結果を画面にレンダリングし、 を使用してそれらの結果をテクスチャにコピーするという逆の方法で行いますglCopyTexSubImage2D。しかし、最終的には、テクスチャ化されたクワッドを描画する形で間接的にコピーするか、フレームバッファからテクスチャへの直接コピーを行うかで、コピーを回避することはできません。

編集:複数のレンダー ターゲットを使用してこれを解決することもできます。テクスチャとレンダー バッファーを異なる色のアタッチメントにアタッチし、フラグメント シェーダーの複数のチャネルに同じ結果の色を出力します (gl_FragData[i]代わりに を使用gl_FragColor)。しかし、それで本当に何かが得られるかどうかはわかりません。さらに、シェーダーが二重レンダリングを認識している必要があります。結局、ES が実際に複数のレンダー ターゲットをサポートしているかどうかはわかりません。

于 2012-09-17T13:29:57.030 に答える