Цветовой / альфа-выход OpenGL слегка затемнен - PullRequest
2 голосов
/ 12 января 2012

Я вижу слегка тусклый цвет / альфа-вывод из OpenGL в Linux. Вместо того, чтобы видеть значение красного компонента 1.0, я вижу ~ .96988. Например, у меня полностью красный прямоугольник (красный компонент = 1.0, альфа = 1.0, зеленый и синий - ноль). Это затемнение происходит независимо от того, активирую ли я свои вершинные / фрагментные шейдеры или нет.

Освещение отключено, поэтому в расчет цвета не следует включать внешний или другой свет.

glBegin(GL_POLYGON);
glColor4f(1.0, 0.0, 0.0, 1.0);
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(1.0, 1.0);
glVertex2f(0.0, 1.0);
glEnd();

Я делаю снимок экрана с полученным окном, а затем загружаю изображение в программу рисования и проверяю любой конкретный пиксель. Я вижу целое значение красного компонента 247 вместо 255, как и следовало ожидать. Когда я запускаю это с включенным вершинным шейдером, я вижу, что компонент gl_Color.r уже <1.0 и компонент gl_Color.a также. </p>

Все состояния OpenGL имеют значения по умолчанию. Чего мне не хватает?

Изменить из-за вопроса: Я определил, что значение красного компонента было ~ .96988 грубым и итеративным процессом проверки его в вершинном шейдере и изменения синего компонента, чтобы он сигнализировал, когда красный компонент был выше порогового значения. Я продолжал уменьшать постоянное значение предела, пока не перестал видеть фиолетовый. Это сделало трюк:

if(gl_Color.r > 0.96988)
{
    gl_Color.b = 1.0;  \\ show purple instead of the slightly dimmed red.
}

Edit:

//VERTEX SHADER
varying vec2 texture_coordinate;
void main()
{
   gl_Position = ftransform();
   texture_coordinate = vec2(gl_MultiTexCoord0);
   gl_FrontColor = gl_Color;
}


//FRAGMENT SHADER
varying vec2 texture_coordinate;
uniform sampler2D Texture0;
void main(void)
{
    gl_FragColor = texture2D(Texture0, texture_coordinate) * gl_Color;
}

В этом случае Texture0 - это полностью насыщенный КРАСНЫЙ прямоугольник Red = 1.0, Alpha = 1.0. Без текстуры, используя цвет вершины, я получаю те же результаты; слегка уменьшенный красный и альфа-компонент.

Еще одна вещь, каналы Red и Aplha "затемнены" на одинаковую величину. Так что что-то вызывает затемнение всего цветового компонента. И, как я уже говорил в основном вопросе, это происходит независимо от того, использую ли я шейдеры или конвейер с фиксированными функциями.

Просто для забавы я выполнил аналогичный тест в Windows с использованием DirectX, и в результате получился прямоугольник с красным компонентом 254; все еще слегка затемненный, но едва.

1 Ответ

2 голосов
/ 08 марта 2012

Я отвечаю на свой вопрос, потому что я решил проблему, и я был ее причиной. Оказывается, я неправильно вычислял цветовые каналы, включая альфа-канал, для вершин в моих моделях при преобразовании из двоичного кода в число с плавающей запятой. Глупая ошибка, которая привела к этому небольшому затемнению.

Например:

currentColor = m_pVertices[i].clr; // color format ARGB
float a = (1.0 / 256) * (m_pVertices[i].clr >> 24);
float r = (1.0 / 256) * ((m_pVertices[i].clr >> 16) % 256);
float g = (1.0 / 256) * ((m_pVertices[i].clr >> 8) % 256);
float b = (1.0 / 256) * (m_pVertices[i].clr % 256);
glColor4f(r, g, b, a);

Я должен разделить на 255. Дох!

Кажется, единственный димминг у меня в мозгу, а не в openGL.

...