Я хотел бы сделать цветную текстуру серым.Делать это в ES 2.0 с помощью шейдера - это очень просто, но возможно ли это сделать в ES 1.x?
ОБНОВЛЕНИЕ
Благодаря @datenwolf, я делаю этовот так:
GLfloat weights_vector[4] = {0.2126, 0.7152, 0.0722, 1.0};
GLfloat additions_vector[4] = {0.5, 0.5, 0.5, 0.0};
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
/* First part */
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, weights_vector);
/* Second part */
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, additions_vector);
Первая часть отображается нормально, если я оставляю ее отдельно, но если я добавляю вторую, она использует «черный» в качестве предыдущего цвета, и поэтому я получаю только серые пиксели.Я делаю это неправильно здесь?
ВТОРОЕ ОБНОВЛЕНИЕ
Если я пытаюсь использовать GL_TEXTURE0
вместо GL_PREVIOUS
, я действительно получаю тот же результат, что и GL_TEXTURE
.Однако, если бы я использовал GL_TEXTURE1
, я получил бы даже не серые пиксели, а черный.Я заблудился здесь ...
ТРЕТЬЕ ОБНОВЛЕНИЕ
Вторая часть работает сейчас.Надо было просто использовать имя предыдущей текстуры, как подсказал @datenwolf!
Однако вывод был неверным, поскольку он был инвертирован.Я исправил это, добавив:
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR);
Теперь слишком темно.И я не могу понять это правильно.Пробовал и не работал:
- умножение весов на два
- добавление 0,5
- модулирование всего изображения на 2
- умножение весовна 2 и затем вычитая на 0,5
ЧЕТВЕРТНОЕ ОБНОВЛЕНИЕ (извините, что их так много)
Я начинаю подозревать, что это невозможно из-за смещения и умножения в DOT3_RGB
.Правильный способ сделать это в сумматоре:
- Добавить 0.5 к входной текстуре
- Рассчитать до весовых коэффициентов: weight_new = (weight_real + 2.0) / (4.0);
- Сделайте
GL_DOT3_RGB
Например, вместо использования:
GLfloat weights_vector[4] = {0.30, 0.59, 0.11, 0.0};
Использование:
GLfloat weights_vector[4] = {0.575, 0.6475, 0.5275, 0.0};
Это действительно становится почти правильный результат, но некоторая часть контраста теряется из-за первого шага и того факта, что числа зажаты в диапазоне [-1.0, 1.0]
Зачем нужны расчеты?Ну, согласно API:
Так что я не вижу другого пути, отличного от того, который я показал, и из-за ограничения точности.Конечно, я мог бы сначала разделить входные данные на 2,0, затем добавить 0,5, сделать точку 3, а затем снова умножить на 2, таким образом, фактически имея все значения в диапазоне [-1,0, 0,0].Но я боюсь, что из-за деления она все равно потеряет точность.
Я подозреваю, что DOT не был предназначен для этой цели, скорее всего, только для разметки или чего-то еще.Очень плохо.Надеюсь, я ошибаюсь, но не понимаю, как.