その場で生成されたテクスチャ (RTT、Render To Texture) からピクセルを読み込もうとしています。ここにリストされているAppleの推奨方法を実装して、このスナップショットを撮っています。
これは、画面に表示される「デフォルト」のカラーバッファに対してはうまく機能しますが、テクスチャに書き込まれたピクセルに対しては機能しません。
私はこれらの行に問題があります:
// Bind the color renderbuffer used to render the OpenGL ES view
// If your application only creates a single color renderbuffer which is already bound at this point,
// this call is redundant, but it is needed if you're dealing with multiple renderbuffers.
// Note, replace "_colorRenderbuffer" with the actual name of the renderbuffer object defined in your class.
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _colorRenderbuffer);
// Get the size of the backing CAEAGLLayer
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
問題は、テクスチャにレンダリングしているため、カラーバッファがないことです。
テクスチャを作成する方法は次のとおりです。
void Texture::generate()
{
// Create texture to render into
glActiveTexture(unit);
glGenTextures(1, &handle);
glBindTexture(GL_TEXTURE_2D, handle);
// Configure texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
レンダリングに使用されるFBOにリンクする方法は次のとおりです。
void Texture::attachToFrameBuffer(GLuint framebuffer)
{
this->framebuffer = framebuffer;
// Attach texture to the color attachment of the provided framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, handle, 0);
}
ご覧のとおり、そもそもバインドできる _colorRenderbuffer がありません。フレームバッファにバインドしてから Apple のコードを実行すればうまくいくと最初は思っていましたが、backingWidth と backingHeight ではテクスチャの解像度 (2048x2048) ではなく、シーンの解像度 (320x320) が得られます。だから私はここで何かが欠けていると思います。