OpenGL: неточный цвет?

Я пытаюсь следовать указаниям на этой странице:
http://www.opengl.org/resources/faq/technical/color.htm
относительно рендеринга примитивов с уникальным цветом

Я проверил количество битов для каждого цвета, и результат был 8 для каждого.
При вызове:

 glColor3ui(0x80000000, 0, 0xFF000000);

и считывая пиксель с помощью glReadPixels(), я получаю цвет: 0xFFFE007F
, который соответствует R=0x7F, G=0, B=0xFE
Два младших бита красного и синего неверны.

Почему?
Я использую новую карту nVidia на ноутбуке Dell с самыми последними драйверами.


person shoosh    schedule 15.12.2008    source источник


Ответы (2)


Оказывается, в FAQ есть ошибка.

В документации glColor говорится, что: "Компоненты целочисленного цвета без знака , если указано, линейно сопоставляются со значениями с плавающей запятой, так что наибольшее представимое значение сопоставляется с 1,0 (полная интенсивность), а 0 сопоставляется с 0,0 (нулевая интенсивность)."
На самом деле это предполагает что для получения полной интенсивности белого цвета я должен вызвать:

glColor3ui(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);

и не

glColor3ui(0xFF000000, 0xFF000000, 0xFF000000);

как следует из часто задаваемых вопросов.
И это объясняет, почему 0xFF000000 отображается на 254.

Я подал отчет об ошибке людям, которые якобы ведут FAQ

person shoosh    schedule 15.12.2008

Вы тоже сделали это?

In either event, you'll need to ensure that any state that could
affect the final color has been disabled. The following code will
accomplish this:

glDisable (GL_BLEND); glDisable (GL_DITHER);
glDisable (GL_FOG); glDisable (GL_LIGHTING);
glDisable (GL_TEXTURE_1D); glDisable (GL_TEXTURE_2D);
glDisable (GL_TEXTURE_3D); glShadeModel (GL_FLAT); 

Также проверьте, имеет ли ваш буфер glReadPixels 24/32 бита.

person schnaader    schedule 15.12.2008