オフスクリーンフレームバッファを使用して、MacOSXでOpenGLの単体テストを行っています。演奏したとき
glClearColor(1, 0, 0.5, 0.5);
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
、各ピクセル0xFF008080
の代わりに私に与えます。0xFF007F7F
この結果が出た理由は紛らわしいです。私が理解できるのはカラーキャリブレーションだけですが、その場合、正しい結果を期待するためにこれを処理する方法がわかりません。(さらに、正しい結果は何ですか?修正された色?または生の色?)
これが私の質問です。
- OpenGLを使用するときに何を期待すべきですか。色を修正しましたか?または生の色?
- 修正パスはいつ実行されますか?フラグメントシェーダーの後?フレームバッファに色を書き込んだ後?
- 生の色をテストする方法はありますか?
- 色補正機能にアクセスして結果を再現できますか?
参照用の完全なソースコードは次のとおりです。
- (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];
}
}