Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242

[Blending] Как рисовать текстуры с прозрачностью даже если они находятся на одной и той дже позиции?

24.01.2022, 23:41. Показов 2762. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот учу OpenGL(glfw\glad\glew) и дошёл до темы блендинга. Почитал на learnopengl.com в топике про блендинг, как там это всё дело работает. "Звучала" для меня вся эта информация странновато, т.к. ранее дело с графикой не имел, но вроде +- ясно.
И там, как раз таки, написано, что необходимо сначала рисовать максимально близкие к тебе объекты(текстуры), если ты хочешь их видеть прозрачными, иначе лови артефакты, в виде исчезновения фона, за, казалось бы, прозрачной текстуркой.
Вот собственно такую механику я и воссоздал, чтобы сначала рисовать самые близкие ко мне объекты с прозрачной текстурой и до самых дальних.
Пример кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void ObjectContainer::sort( glm::vec3 cameraPosition )
{
    std::vector< std::pair< float, DrawableObj* > > clearObjects;
    std::vector< DrawableObj* > otherObjects;
    clearObjects.reserve( objects_.size() );
    
    for ( auto& obj : objects_ )
    {
        if ( obj->isTransparent() )
        {
            auto distance = glm::distance( obj->getTranslate(), cameraPosition );
            auto tmp = std::make_pair( distance, obj );
            clearObjects.emplace_back( tmp );
        }
        else
            otherObjects.emplace_back( obj );
    }
 
    std::sort( clearObjects.begin(), clearObjects.end(), []( const auto& a, const auto& b )
    {
        return a.first > b.first;
    } );
 
    objects_.clear();
    objects_ = std::move( otherObjects );
    objects_.reserve( clearObjects.size() + objects_.size() );
 
    for ( auto& obj : clearObjects )    
        objects_.emplace_back( obj.second );    
 
}
Но появилась другая проблема. С целью поиграться поучиться я решил создать "кустик с травой" - и вот же делема. Там травинки распологаются довольно близко друг к другу и как-то адекватно опредеделить, кто из них ближе, а кто дальше - я не могу. По этой причине, когда неудачно подойти к ним, то появляется то одна часть травинки, то вторая(т.к. сначала может рисоваться та что чуть ближе и закрывать более дальнюю часть второй травинки). Что делать в такой ситуации, как в принципе решить подобного рода делему?
Миниатюры
[Blending] Как рисовать текстуры с прозрачностью даже если они находятся на одной и той дже позиции?   [Blending] Как рисовать текстуры с прозрачностью даже если они находятся на одной и той дже позиции?  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2022, 23:41
Ответы с готовыми решениями:

Добавить в программу фрагмент в котором определяется расстояние между судами если они находятся на одной долготе)
Указание координат двух судов и вывод их на дисплей. ...

Как открыть формы с одной и той же позиции?
Хелп ми, плиас) Если поставить StartPosition = Center на обе формы, они появляются в одном и том же месте, с центра. А как сделать так,...

Найти элементы, которые находятся в каждом из кортежей на той же позиции
Вторая задачка, которая так же не поддается. Дали задачку, в ней идей вообще нет. Через что решается? Через обычное сравнение if, как я...

3
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.01.2022, 06:46
Лучший ответ Сообщение было отмечено MJ_PRUTYG как решение

Решение

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Что делать в такой ситуации, как в принципе решить подобного рода делему?
MJ_PRUTYG, в случае, если прозрачность бинарная(т.е. либо 0, либо 1, у тебя с "травкой" прокатит), можно вообще не сортировать.
Просто в шейдере отбрасывай(discard) прозрачные (с альфой 0) фрагменты.

В более общем случае, когда объекты со сложной геометрией и частичной прозрачностью, их сортировка не поможет, т.к. они могут пересекаться или быть вложенными.
И тут уже не всё так просто.

Два самых распространенных способа реализации order-independent transparency (OIT) это:
  1. сортировка фрагментов на GPU (желательно OpenGL 4.3 или ARB_shader_image_load_store).
    Пример можешь посмотреть тут.
  2. depth peeling.
    Базовая концепция тут.
    Парочка улучшений: dual depth peeling и multi-layer depth peeling

Есть еще несколько "трюков", но они специфичны, например: stochastic OIT и weighted blended OIT
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
25.01.2022, 10:55  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
в случае, если прозрачность бинарная(т.е. либо 0, либо 1, у тебя с "травкой" прокатит), можно вообще не сортировать.
Просто в шейдере отбрасывай(discard) прозрачные (с альфой 0) фрагменты.
К сожалению или к счастью прозрачность не бинарная. Просто есть альфа канал со значением от 0 до 1(как, в принциепе, и всегда) + включаю блендинг.

В общем, суть твоего сообщения я понял. Спасибо тебе большое, теперь хоть знаю про новые "трюки" в графике, вернее какие-то приёмы. То странная вся эта тема, вроде такое прикольное, весёлое, а информации супер-много я не нахожу

Добавлено через 1 минуту
PS: конкретно эта проблема еще решается отключением (на вермя) буфера глубины
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.01.2022, 11:03
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Просто есть альфа канал со значением от 0 до 1(как, в принциепе, и всегда) + включаю блендинг
Это понятно, я имел ввиду, что для твоей "травки" её альфа канал можно "бинаризовать" в шейдере (color.a = step(0.5, color.a);) и отбрасывать фрагмент с 0 альфой(if(color.a == 0) discard; (блендинг вообще можно отключить). Трава сильно не пострадает.

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
конкретно эта проблема еще решается отключением (на вермя) буфера глубины
Наверное, отключить запись в буфер глубины(хотя и тут будут артефакты), иначе артефакты будут, если совсем отключить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2022, 11:03
Помогаю со студенческими работами здесь

Использование одной и той же текстуры в разных контекстах
Добрый вечер. Я выполняю рендеринг в несколько окон интерфейса windows, и передо мной встала задача отображать одну и ту же текстуру в этих...

Как заставить программу реагировать на нажатие клавиши даже если они обращены не к ней?
День всем добрый! Хочу сделать работающую на фоне программу, которая будет ловить нажатие на клавишу PrintScreen и выполнять какое-то...

Как сделать чтобы снижалось разрешение текстур, если они находятся далеко?
Моя игра похожа на майнкрафт, поэтому разрешение текстур тут 32 на 32. Проблема в том, что когда текстура находится на таком расстоянии,...

Как снять галочки циклом с Checkbox если они находятся в разных Grid
Вот такая проблема. Если чекбоксы находились на одной wrappanel, то галочки я снимал вот так: &lt;WrapPanel...

Как прикрутить один файл PHP к другому, если они находятся в разных папках?
В файле который находится здесь: public_html/components/com_k2/templates/default/user.php находится функция вызов пола пользователя ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru