2012-01-11 2 views
2

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

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

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.

Все состояния 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 в данном случае является полностью насыщенным красным прямоугольником красного = 1,0, альфа = 1,0. Без текстуры, используя вершинный цвет, я получаю те же результаты; слегка уменьшенный красный и альфа-компонент.

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

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

+0

Могу я узнать, где вы видите значение ~ .96988. Я предполагаю, что это нормально работает со значениями с плавающей запятой. –

+0

У вас есть работающий с композитором? Если да, убедитесь, что он не играет в игры с выходом вашего окна через плагин или что-то подобное. – genpfault

+0

Есть ли у водителя гамма-набор? –

ответ

2

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

Например:

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. Doh!

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

Смежные вопросы