Конференция "Игры" » OpenGL текстура + alpha канал [Delphi, Kylix, C++ Builder, JBuilder, Windows, Linux]
 
  • anton777 (01.03.09 15:50) [0]
    полно примеров по OpenGL с текстурами, но нету с альфа каналом((

    точнее они есть, но совсем не те что надо.
    а нужен самый простой КЛАССИЧЕСКИЙ так сказать пример.
    тоесть есть RGB(сам цвет) + четвертый байт A(альфа).
    как я понимаю
    A=255 => RGB=100%(тоесть посностью закрывает в этом пикселе задний фон)
    A=0    => RGB=0% (полностью позрачный)
    A=128 => RGB=50%(вот тут я уже начинаю как это все должно сумироваться).

    да, да я даже догадываюсь что вы сейчас скажите ;) => glBlendFunc.
    да я ее смотрел честно говоря за последние пару дней вообще запутался как это работает она и подобные ей.
    вообще что мне конкретно надо: если RGB(255,255,255) А(0) то не рисовать вообще ничего.
    максимум что получалось так RGB(0,0,0) А(0) =>0%
    тоесть если в альфе канале 0 то в картинке должна быть "дырка".
    как я понимаю тут надо правильно сделать инициализвцию OpenGL, правильно загрузить текстуру с Альфой и правильно включить режим смешивания.
    но как я говорил в сети полно примеров со всякими "фичами" с прозрачностью а нужного такого простого нет.
    да статей тоже полно где вроде все просто описывается (опять про "фишки" "кульнве" с альфой) .

    Спасайте ((
  • @!!ex © (01.03.09 21:00) [1]
    Вот что бывает, когда графикой занимаешься не понимая математики... Что греха таить, сам такой был.

    Если нужна просто дырка, то блендинг не нужен.
    Достаточно альфа теста:
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER,0.0);

    Блендинг нужен, когда нужны градации прозрачности.

    В качестве загрузки текстур рекомендую использовать TGA. Крайне простой формат(если игнорировать сжатие и индексные цвета), поддерживающий альфу.
  • tButton © (07.04.09 09:52) [2]
    Извините, что вмешиваюсь, но не подскажете ли нормальный редактор позволяющий работать с ТГА и альфой?
    Или хотя бы конвертировать ПНГ в ТГА
  • @!!ex © (07.04.09 10:24) [3]
    > [2] tButton ©   (07.04.09 09:52)

    GIMP
  • akelth (27.05.09 14:50) [4]










































































  • V@s_!s_D@s © (03.05.10 14:51) [5]

    > Блендинг нужен, когда нужны градации прозрачности.


    > Если нужна просто дырка, то блендинг не нужен.
    > Достаточно альфа теста:
    > glEnable(GL_ALPHA_TEST);
    > glAlphaFunc(GL_GREATER,0.0);


    Так, а я не понял, куда это нужно будет вставлять, и что получится, если посмотреть там на тыльную сторону Этой дырки.
  • @!!ex © (03.05.10 15:18) [6]
    в код
  • V@s_!s_D@s © (03.05.10 16:34) [7]
    Я Бурно смеюсь). Конкретно куда
    Я вот этой функции не знаю :glAlphaFunc(GL_GREATER,0.0);
    Не было в учебнике. Вы не могли бы мне разъяснить?
  • @!!ex © (03.05.10 19:13) [8]
  • V@s_!s_D@s © (04.05.10 00:47) [9]
    благодарю - дейсвительно это логично
  • V@s_!s_D@s © (08.05.10 17:02) [10]
    Теперь у меня вопрос - чем это отличается от буфера трафарета? glEnabie(GL_STENCIL_TEST)
    как я понимаю, результат один -дырка.
  • @!!ex © (08.05.10 17:12) [11]
    Тем что это НЕ буффер трафарета. Вопроса глупее не слышал.
    Рекомендую всеже ознакомится с матчастью, прежде чем задавать вопросы.
    Судя по всему, пока вы не поймете как работает графика - будете фигней страдать.
  • V@s_!s_D@s © (08.05.10 17:38) [12]
    .
    > Тем что это НЕ буффер трафарета

    Это то я как раз понимаю
    Я имел в виду "если результат одинаков, то следует искать более динамичный вариант". Как я понимаю, сдесь будет проще использовать именно трафарет.
    Ведь трафарет можно перезаполнять быстрее, чем пересоздавать текстуру + альфа канал к ней
  • @!!ex © (08.05.10 17:46) [13]
    Вы явно не понимаете о чем говорите.
    Еще раз:

    > Судя по всему, пока вы не поймете как работает графика -
    > будете фигней страдать.
  • V@s_!s_D@s © (08.05.10 18:20) [14]
    Подождите-ка.
    Давай те ка разберёмся. Признаюсь, Были проблемы с блендфунк, Но раз на практике они исправлены, то и в теории ничего не понимать я не могу.
    (Горячая дискуссия начинается :) ).
    Мы имеем входную текстуру, ну там примитив. Он имеет какое либо значение альфа, которое сравнивается с заданым функцией, после чего прошедшие тест части примитива отображаются. Я это правильно понимаю?
  • V@s_!s_D@s © (08.05.10 18:24) [15]
    Соответственно этот примитив(текстуру) нужно создать заново, в случае, если мы хотим поменять прозрачные оьбласти.
  • V@s_!s_D@s © (08.05.10 18:24) [16]
    тоесть переназначить альфу
  • V@s_!s_D@s © (08.05.10 18:29) [17]
    Я имел в виду вызов глтекстуре2д с предыдущим текстуре[x,y,3]:=f;
  • V@s_!s_D@s © (08.05.10 19:03) [18]
    буфер же трафарета , как мне кажется будет здесь более уместен именно потому, что он как я понимаю, представляет лишь маску, массив, который по определению переназначать быстрее, а не полупрозрачную текстуру.

    Кстатьи прошу простить меня за возможную неграмотность в данном вопросе и пожалуйста поподробнее разьяснить мне мои заблуждения. Боюсь как бы мне не пришлось переучивать эти темы).
  • @!!ex © (08.05.10 19:08) [19]
    Как ты будешь делать дырку с помошью стенсиля?
    Алгоритм по шагам опиши
  • V@s_!s_D@s © (09.05.10 01:50) [20]
    Сам его три дня назад начал изучать, Поэтому возможно ошибаюсь, НО:
    В книге краснова, например рисуется изображение дырки. То есть я так понял, происходит сперва заполнение трафарета, и уже после рисование.
    Но там у него не очень понятно - использовать можно, благо он даёт исходники, но вот разобратся очень сложно.
    А вот позавчера нашёл интересную статью Вот ссылка
    "http://citforum.proc.ru/programming/opengl/opengl_04.shtml"
    сейчас её подробнейше изучаю - там очень подробно и детально изложен алгоритм.
    Вот что я понял:
    (там куб и сфера)
    сперва рисуем - заполняем трафарет на +1 там где рисуем.
    glStencilFunc(GL_ALWAYS, 1, 0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    auxSolidCube(2.5);
    Хотя возможно тут я ошибаюсь, но как понимаю данную команду, она рисует примитив, и где рисует, заполняет на +1.
    Потом ещё также. И местами изменяем это благообразие ещё на +1.
    потом очищаем буферы все, кроме трафарета (имеем дырявую фигуру, т.е заполненую разными значениями).
    Потом запрещаем буфер трафарета(не очищаем) и рисуем.
    потом включаем трафарет и рсуем дырявую фигуру.
    // разрешаем тест трафарета и рисуем дырявый куб
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_EQUAL, 1, 255);
    glColor3d(1,1,1);
    auxSolidCube(2.5);
    Я признаюсь, пробовал только красновскую версию.
    Так или примерно так было написано в различных найденых мной исходниках.
    Получается, если в буфере глубины есть изображение етой фигуры, то мы можем рисовать и за ней (я так понял, что буфер глубины не заполняется, ведь изображение там не рисуется). Правда буфер глубины, как я понимаю проверяет все пикселы экрана, а не фигуры, но вот для этой фигуры и будем его включать.
    или воти чёто тут интересное нашёл
    ->http://opengl.org.ru/books/open_gl/chapter4.12.html
  • @!!ex © (09.05.10 08:19) [21]
    И так. Есть забор с узором:
    http://www.dxf.ru/images/zabor_03.gif

    Как ты будешь стенсилем вырезать эти дыры?

    Текстуру с альфой я нарисую минут за 10 и она будет прекрасно работать.
  • V@s_!s_D@s © (09.05.10 09:04) [22]
    Ага,  (с праздником победы тебя) то есть ты уже согласен, что так можно делать.
    Не, вообще есть такая функция трафарета, не помню, как пишется, каюсь,
    прибавляет +1. и соответственно всю текстуру анализируем на цвет, или ещё как нибудь - не важно. важно, что по какомунибудь шаблону и используем эту функцию.
    Я её ещё не применял, но думаю сработает.
    Получается следующее: стенсил труднее алгоритмически, но зато универсальнее, хотя ,согласен, при использовании медленнее.
    бленд Быстрее при использовании, но не изменяется произвольно, т.е текстуру надо перезадавать, а трафарет к томуже допускает , хотя это я ещё не проверял, но должно быть так, рисование позади себя, а бленд должен рисоватся по порядку.
  • @!!ex © (09.05.10 09:10) [23]
    Так НЕЛЬЗЯ делать.
    Стэнсиль для других вещей предназначен.
    И то что ты предлагаешь делать убьет производительность и не даст НИКАКИХ преимуществ.

    Помойму тебе тупо лень разбираться в том, как делать правлиьно и хорошо, и ты ищешь решение в рамках своего знания(не знания?).

    Мой тебе совет: напиши собственный software 3D. Мозги прочищает основательно.
  • @!!ex © (09.05.10 09:10) [24]
 
Конференция "Игры" » OpenGL текстура + alpha канал [Delphi, Kylix, C++ Builder, JBuilder, Windows, Linux]
Есть новые Нет новых   [118673   +62][b:0][p:0.002]