1

その場で生成されたテクスチャ (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) が得られます。だから私はここで何かが欠けていると思います。

4

1 に答える 1

1

テクスチャにレンダリングするには、内部ストレージが必要です。そのため、テクスチャglTexImage2Dにレンダリングする前に、ある時点で呼び出す必要があります(おそらくNULL、画像データとして渡し、テクスチャ画像を割り当てるだけです)。

しかし、backingWidthとbackingHeightは、テクスチャの解像度を提供しません

とにかくこれらの値を取得したいのはなぜですか(もちろん、これらの取得関数は、名前が示すようにレンダーバッファーで機能するため、機能しません)。テクスチャを作成したのはあなただったので、あなたはすでにそれを知っています(上記を参照)。

テクスチャにレンダリングしたらglReadPixels、通常の画面をキャプチャする場合と同じように呼び出すことができます。これは、テクスチャがフレームバッファになっているため、フレームバッファからピクセルを読み取ると、テクスチャからピクセルが読み取られるためです(もちろん、FBOはバインドされている必要があります)。それを呼び出すときglReadPixels)。

これは、実際にはESのテクスチャデータを読み戻す唯一の方法であり、これはありませんがglGetTexImage、とにかくレンダリングしたばかりなので、これはまったく問題ありません。

于 2012-09-26T12:06:23.977 に答える