Раскраска серого изображения в OpenGL - PullRequest
1 голос
/ 03 декабря 2009

Я пытаюсь нарисовать изображение в градациях серого цвета в качестве текстуры в OpenGL, используя два цвета. Черный переходит в цвет1, а белый - в цвет2. Текстура загружается с помощью GL_RGBA.

Я пробовал два решения:

1)

  • Загрузить изображение как текстуру
  • Рисование изображения на экране
  • Включить смешивание
  • glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); и нарисуйте прямоугольник с цветом1
  • glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE); и нарисуйте прямоугольник с цветом2

Но ... Когда я применяю первый цвет, на экране нет черного цвета, а когда применяется второй цвет, он также комбинируется с первым цветом.

2)

  • Сохранить изображение как текстуру, но не использовать изображение в градациях серого, использовать белое изображение с альфа-каналом, аналогичным оттенку серого
  • Нарисуйте прямоугольник с цветом1
  • Нарисуйте изображение

Но ... Когда изображение рисуется, оно не использует color1, где изображение прозрачно, вместо этого оно использует текущий цвет, установленный с glColor.

Любая помощь пригодится:)

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

В общем, при работе с конвейером текстурирования OpenGL я рекомендую записывать желаемый конечный результат. здесь вы хотите, чтобы ваш полутоновый цвет использовался как интерполант между вашими 2 цветами.

out_color = mix(color1, color2, texValue)

Математика для этого на самом деле что-то вроде:

out_color = color1 + (color2 - color1) * texValue

Итак ... существует ли значение текстурной среды , которое помогает это сделать? Да, и он также называется GL_BLEND (не путать с буфером наложения на кадры, который glEnable(GL_BLEND) включает).

Итак ... что-то вроде

// pass color1 as the incoming color to the texture unit
glColor4fv(color1); 
GLfloat color2[4] = { ... };
// ask for the texture to be blended/mixed/lerped with incoming color
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_BLEND); 
// specify the color2 as per the TexEnv documentation
glTexEnvfv(GL_TEXTURE_2D, GL_TEXTURE_ENV_COLOR, color2)

Нет необходимости рисовать несколько раз или что-нибудь более сложное, чем это, как вы пытались сделать. У конвейера текстурирования есть много способов получить контроль. Изучите их в своих интересах!

0 голосов
/ 03 декабря 2009

Ваша идея №2 сработает, но, похоже, вы неправильно настроили смешивание. Должно быть:

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...