1

オフスクリーンフレームバッファを使用して、MacOSXでOpenGLの単体テストを行っています。演奏したとき

        glClearColor(1, 0, 0.5, 0.5);
        glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

、各ピクセル0xFF008080の代わりに私に与えます。0xFF007F7Fこの結果が出た理由は紛らわしいです。私が理解できるのはカラーキャリブレーションだけですが、その場合、正しい結果を期待するためにこれを処理する方法がわかりません。(さらに、正しい結果は何ですか?修正された色?または生の色?)

これが私の質問です。

  1. OpenGLを使用するときに何を期待すべきですか。色を修正しましたか?または生の色?
  2. 修正パスはいつ実行されますか?フラグメントシェーダーの後?フレームバッファに色を書き込んだ後?
  3. 生の色をテストする方法はありますか?
  4. 色補正機能にアクセスして結果を再現できますか?

参照用の完全なソースコードは次のとおりです。

- (void)test_1000_createContext
{
    NSOpenGLPixelFormatAttribute    pfa[1]  =   { 0 };
    NSOpenGLPixelFormat*    pixelFormat     =   [[NSOpenGLPixelFormat alloc] initWithAttributes:pfa];

    @autoreleasepool
    {
        NSOpenGLContext*        GL              =   [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
        [GL makeCurrentContext];
        {
            ASS (GL != nil);

            GLuint  fb;
            GLuint  rbc;
            glGenFramebuffers(1, &fb);
            glGenRenderbuffers(1, &rbc);
            ASS (fb !=0 );
            ASS (rbc != 0);

            GLint w, h;
            w = 2;
            h = 2;

            glBindRenderbuffer(GL_RENDERBUFFER, rbc);
            glBindFramebuffer(GL_FRAMEBUFFER, fb);
            glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h);
            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbc);
            glClearColor(1, 0, 0.5, 0.5);
            glClear(GL_COLOR_BUFFER_BIT);
            glFinish();

            uint8_t*    buffer      =   malloc(4*w*h);
            glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
            NSData* bdat    =   [[NSData alloc] initWithBytesNoCopy:buffer length:4*w*h freeWhenDone:YES];
            NSLog(@"%@", bdat);

            uint8_t     answer[]    =
            {
                0xFF, 0x00, 0x7F, 0x7F,
                0xFF, 0x00, 0x7F, 0x7F,
                0xFF, 0x00, 0x7F, 0x7F,
                0xFF, 0x00, 0x7F, 0x7F,
            };
            ASS (memcmp(answer, buffer, 4*4) == 0 );
        }
        [NSOpenGLContext clearCurrentContext];
    }

}
4

0 に答える 0