Как сделать текстуру с помощью альфы? - PullRequest
1 голос
/ 07 сентября 2011

Как сделать текстуру с альфа-каналом?

У меня есть текстура, и мне нужно визуализировать ее с разными значениями альфа в разных местах. Есть ли способ сделать это? (Моя текстура GL_RGBA)

Если невозможно изменить альфа-значение на лету, мне придется создавать разные текстуры для разных альфа-уровней?

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Во-первых, убедитесь, что ваша текстура имеет альфа-канал.Вы упоминаете, что загружаете формат RGBA, но всегда полезно проверить исходный файл в программе для редактирования изображений.Затем убедитесь, что ваша текстура готова для рендеринга в openGL.Распространенная ошибка - забыть установить режим фильтрации текстуры через glTexParameter*.Он начинается с настройки, требующей mipmaps, поэтому я считаю, что проще всего начать с:

glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR);

Во-вторых, вам нужно настроить openGL, чтобы быть готовым к смешиванию.Это включает glEnable вызов с GL_BLEND и glBlendFunc вызов.В большинстве случаев вам нужно, чтобы вызов функции был glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), поскольку большинство других комбинаций токенов дадут вам эффекты, которых вы не достигли (см. Страницу спецификации glBlendFunc для получения дополнительной информации).

Наконец, убедитесь, что вы пробуете свою текстуру в разных точках.Если вы используете непосредственный режим (вы используете glVertex* для рисования вашей сцены), вам нужно будет либо использовать glTexGen*, либо вручную указать точки текстуры с помощью glTexCoord* перед вызовом glVertex*.Если вы используете данные массива для рисования вашей сцены, убедитесь, что вы включили указатель текстуры, используя glEnableClientState(GL_TEXTURE_COORD_ARRAY) и glTexCoordPointer.

2 голосов
/ 07 сентября 2011

Ваша текстура GL_RGBA, поэтому имеет различное альфа-значение для каждого текселя.

Если вы хотите изменить альфа-значение, используемое для рендера, я могу подумать о следующих методах:

  • Изменить альфа-значения текстуры (не уверен, если вы скажете, что не хотите этого делать).
  • Используйте glColor4f, чтобы изменить альфа-значение вершин.Это умножит значения текстуры.Возможно, вам придется использовать glEnable(GL_COLOR_MATERIAL) и / или glColorMaterial().
  • . Используйте вершинный шейдер, чтобы изменить значения альфа-вершины.Он умножит значения текстуры.
  • Используйте фрагментный шейдер, чтобы изменить выборочные значения текстуры на лету.
  • Используйте два этапа текстуры и умножьте их.Второй будет иметь измененные альфа-значения (см. glActiveTexture() и друзья).
  • Используйте фрагментный шейдер и два (или более) этапа текстуры.Это самый крутой!
...