4

次の方法で作成されたFBOがあります。

glGenRenderbuffers(1, &m_depthStencilBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, m_width, m_height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_texture);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, m_width, m_height, 0, GL_RGBA, GL_FLOAT, 0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);

glGenFramebuffers(1, &m_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, m_texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));
glBindFramebuffer(GL_FRAMEBUFFER, 0);
assert(GL_NO_ERROR == glGetError());

次に、この最小限のフラグメントプログラムを使用してこれをレンダリングします。

void main() {
    gl_FragColor = float4(3.001001f, 2.00002f, 7.00003f, 4.00004f);
}

このようにピクセルを読み取った場合:

glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &pixels[0]);

上記のフラグメントプログラムによって書き込まれたピクセルが(1、1、1、1)であることを確認します。テスト目的でのみ追加しました。glReadPixelsを使用して別のフラグメントプログラムでFBOをサンプリングしようとすると、同じ問題が発生しtextureRectます。

4

2 に答える 2

5

はい、範囲 (0, 1) に固定されます。glClampColorをチェックして、カラー クランプを無効にしてください。

お役に立てれば!

于 2012-06-08T14:35:00.287 に答える
3

この問題は、私が呼び出した FBO のサイズ変更コードで、私の愚かなバグでした。

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, ...);

それ以外の

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, ...);
于 2012-06-12T06:02:19.623 に答える