прозрачность для цвета в opengl

Тема в разделе "WASM.OpenGL", создана пользователем NEG, 16 окт 2005.

  1. NEG

    NEG New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    9
    Надо сделать так,чтобы определенный цвет при включенном GL_BLEND был прозрачным.Такая техника кажись billboarding называется.Нащел толко для черного цвета,а для других нефига
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Непосредственно прозрачности по цвету в OpenGL нет. Billboarding это свосем из другой оперы.



    Единственный выход который я вижу если не прибегать к шейдерам это alpha-test.







    Это каким образом?
     
  3. NEG

    NEG New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    9
    из уроков nehe

    а как alpha-test'ом
     
  4. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
  5. NEG

    NEG New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    9


    это не совсем то.Мне надо чтобы прозрачными были только определенные цвета
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    NEG,
    то что ты хочешь сделать, можно сделать несколькими путями.
    например, через использование "масок": здесь применяется gLBlendFunc и включённый блендинг. вкратце: отрисовывается та часть, где соответствующая область у маски для текущей текстуры имеет темные оттенки. Это значит, что тебе нужно иметь 2 картинки: одну для самой картинки, а другую черно-белую, которая содержит маску для вывода.

    другой метод, на мой взгляд, более современный: юзать одну 32хбитную картинку для текстуры, с указанным альфа-каналом для прозрачности и выводить ее через ARB расширения OpenGL. делается в 5-8 строк.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    varnie

    Так-так :))

    Твоя "маска" в "прозрачных местах" затрет то, что под ними уже было нарисовано. Плюс будет загажен z-buffer, т.е. рисование маски до всего не спасет.

    :) Альфа-тест это не расширение. Возможно конечно ты имеешь ввиду GL_ALPHA_TO_COVERAGE, но почему-то я сильно сомневаюсь ;)


    NEG


    Все просто. Загружай RGBA текстуру. В альфа канале нарисуй требуемый трафарет. Потом:

    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(...); // Тут задаешь правило, при выполнении которого пиксель будет отрисован. Например:

    glAlphaFunc(GL_GREATER, 0.5f); - говорит о том, что отрисуются все пиксели, чья альфа больше чем 0.5.

    -------------------

    На счет шейдеров несколькими постами выше я наврал. Сейчас нет возможности сделать это на шейдерах. Есть в 10-м директе. Там есть функция discard(), отменяющая отрисовку пикселя.
     
  9. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    Биллборды - это плоские спрайты, которые всегда повернуты "лицом" к наблюдателю, например из них делают дым, взрывы, искры и т.д.
    Чтобы сделать текстуру прозрачной, нужно добавить в нее алфаканал, но не стоит забывать, что для правильного отображения таких текстур, необходимо упорядочить грани, содержащие их по, глубине и выводить от самой дальней к самой ближней. Для этого в алгоритме биллбординга например используется быстрая сортировка.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    MrMadguy

    Если я правильно понял аффтара, то ему нужна полная прозрачность, а не полупрозрачность. Для полной прозрачности по определенному цвету надо юзать как раз таки альфа-тест. Тогда и грани сортировать не нужно и филлрейт будет быстрее.