Комментарии 7
В конечном итоге я исправил это на стороне CPU; строку
(float)adjacencyв буфере экземпляров я заменил на
(float)adjacency+0.5f
Почему он сразу так не сделал? Очевидно, что при преобразовании int во float и обратно, обязательно наступит момент, когда у float появится отрицательный эпсилон.
Все решается проще через flat квалификатор. Была бы там поддержка интов, без него вообще бы шейдер не скомпилировался.
Не понимаю зачем для тайла из пары треугольников вообще использовать инстансинг и что делать со щелями на границах тайлов в худшем случае.
(float)adjacency+0.5f
inline long int fround(float x)
{
return _mm_cvtss_si32(_mm_load_ss(&x));
}
upd: у вас другая задача: сделать такой float, чтобы при отсечении дробной части всегда получался исходный int. Но да ладно, может кому пригодится функция
//структура для наглядности
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct Vertex {
pub pos: [f32; 3],
pub norm: [f32; 3],
pub uv: [f32; 2],
pub v_id: f32,
}
//fragment shader
if (int(v_ID + 0.5) == level.isSelected) {Или в шейдере сразу можно, правда для этого придется передавать его, а выбирать трассировочным лучом бвх или бсп - обычно спуск по дереву, выбор по айди, если это выбор. Или не выбирать как у автора.
На всякий случай: такая ситуация с деревом(бсп-браш или бвх оба по центровкам уи обьектов могут работать) хорошо вписывается в структуру мира где есть 2 дерева для уи и для обьектов, мир может быть любым, потомучто камера может работать в двух режимах орто и перспектива и их можно смешивать.
Друг. Я тут BGFX начинаю изучать не поможешь литературкой как работать с шейдерами ? а то документация самого bgfx сильно куцая

Сегодня я узнал нечто новое о GPU благодаря багу в своей игре