Macos Mac OS X Opengl输出意外的颜色。glClearColor(1,0,0,0.5)生成0xff000088而不是0xff00007f
我正在使用屏幕外的帧缓冲区在MacOSX上对OpenGL进行单元测试。 当我表演的时候Macos Mac OS X Opengl输出意外的颜色。glClearColor(1,0,0,0.5)生成0xff000088而不是0xff00007f,macos,opengl,colors,Macos,Opengl,Colors,我正在使用屏幕外的帧缓冲区在MacOSX上对OpenGL进行单元测试。 当我表演的时候 glClearColor(1, 0, 0.5, 0.5); glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer); ,它为每个像素提供0xFF008080而不是0xFF007F7F。令人困惑的是,为什么会有这样的结果。我唯一能弄清楚的是颜色校准,但在这种情况下,我不知道如何处理这个问题以期望正确的结果。(甚至,
glClearColor(1, 0, 0.5, 0.5);
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
,它为每个像素提供0xFF008080
而不是0xFF007F7F
。令人困惑的是,为什么会有这样的结果。我唯一能弄清楚的是颜色校准,但在这种情况下,我不知道如何处理这个问题以期望正确的结果。(甚至,正确的结果是什么?校正后的颜色?还是原始颜色?)
这是我的问题
- (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];
}
}
我想不出什么能引起这一切。我认为OpenGL中没有任何颜色校正这样的概念(至少默认情况下没有启用)。您是否尝试过0.5以外的其他值?是只有alpha通道关闭了还是所有通道都一样?@Tim所有通道都一样。我更新了我的问题。我将蓝色设置为
0.5F
,现在蓝色也是0x88
。也许这与预乘与非预乘alpha有关?@nielsbot如果有这样的事情,可能是因为它。如何获取当前模式并进行设置?您的缓冲区每个组件只有四位,因此会发生一些箝位/转换。如果使用GL_RGBA8作为渲染缓冲区的内部格式,会发生什么情况?