LINUX.ORG.RU

shex - мой просмотрщик двоичных файлов. С++, Vulkan, glfw3

 , , , ,


3

1

Сегодня, наконец, допилил функциональность и решил выложить исходники.

Функциональность минимальная. Можно двигать клавишами вверх, вниз, page up, page down, [shift] + F3-F9, колесом мыши, а так же мышкой двигать линейку прокрутки слева.

Просто потихоньку изучаю Вулкан. Гуй встроен в шейдер.

Всем хорошего дня!

https://github.com/alexkh/shex

>>> Просмотр (600x1067, 56 Kb)

★★

Проверено: hobbit ()

Гуй встроен в шейдер

Эдик покусал?

sudopacman ★★★★★ ()

Сколько ФПС? Кстати, сделай для прикола скрин с mangohud :)

BceM_IIpuBeT ★★★☆☆ ()
Последнее исправление: BceM_IIpuBeT (всего исправлений: 1)
Ответ на: комментарий от BceM_IIpuBeT

Ну а при чём тут фреймрейт? Он ограничен в функции mainLoop

void mainLoop() {
	while(!glfwWindowShouldClose(window)) {
		glfwPollEvents();
		drawFrame();
		usleep(100000);
	}

	vkDeviceWaitIdle(device);
}

По идее, можно вообще отрисовку делать только при изменении содержимого. Надо только будет хорошенько отладить, чтобы глюков никаких не было и не зависало в различных ситуациях в разных оконных менеджерах…

svyatozar ★★ ()
Ответ на: комментарий от svyatozar

Предлагаю добавить в прокрутку motion blur, а цветовую раскраску текста сделать с эффектом подповерхностного рассеивания. Так же для лучшего восприятия текста можно добавить parallax mapping ну и эмбиент оклюжн для пары. Ну и чтобы можно было грабить корованы.

BceM_IIpuBeT ★★★☆☆ ()
Ответ на: комментарий от xmikex

Не может, без лицензии == копиригхт Ц svyatozar все права защищены кто нарушит в клетку. Даже смотреть в них незаконно, выложить то выложил но никаким образом их использовать нельзя. Для публик домаина надо CC0 лицуху приложить явно, можно просто одной строчкой написать. Понятное дело что ТС в по судам таскать не будет да и вообще ему пофиг ибо он изучает, а выложил похвалится прогрессом и это хорошо ему приятно, может кому полезно. Но всё же без какого либо упоминания что он разрешает делать с кодом делать с ним ничего нельзя. Ладно gits или тут на форуме кусок кода, а там у него публичный готовый проект.

LINUX-ORG-RU ★★ ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от xmikex

Ну в техже играх эффективная работа с текстом всегда была проблемой, а некоторые игры на 90% состоят их тоннн текста Eve Online например, будет полезно тем кто захочет выводить текст в своей игре на вулкане например.

LINUX-ORG-RU ★★ ()
Ответ на: комментарий от Keltir

OpenGL в промежутке от 2.1 до 3.3 в режиме совместимости. Ниже тлен, выше бред. А вообще никакое не нравится, они все говно. Мне нравятся лишь отдельные части общей архитектуры. Да и мне ли судить в принципе вулкан не знаю, метал не знаю, пару умерших уже не знаю, ниже 2,1 не знаю, выше 3,0 не знаю =)

LINUX-ORG-RU ★★ ()
Ответ на: комментарий от LINUX-ORG-RU

ну это - старье. мне тоже когда-то нравилось писать на Дх11 пушо там хуяк хуяк и уже все готово. не надо втариваться в тонкости реализации и АПИ было гораздо проще. сейчас, модерн АПИ предоставляют дохера свободы для тюнинга. АПИ Дх12 и Вулкана очень похоже, кстати. Просто надо взять это и обернуть в хорошо продуманную оберточку из абстракций и работать с ними, а не с вулканом напрямую. а тут у человека весь код в одном файле, там и класс какой-то его в перемешку с вулканом, ужс одним словом.
А если хорошо покурить, то АПИ вулкана очень даже норм, хорошие доки(условно хорошие).

Keltir ()
Последнее исправление: Keltir (всего исправлений: 1)
Ответ на: комментарий от Keltir

ну это - старье

При всём уважении это тупое выражение, требовать для вывода текста 450 шейдеров вместо 120 или даже 110 модно и молодёжно и работать будет на 3.5 железках. Зато новое. Использовать новейшие техники/механизмы прочее имеет смысл только

  • твоя платформа контантна, железо одно == проблем нет

  • твои требования к реализации важнее то на чём это будет работать.

  • ты просто изучаешь (вариант ТС), критики не подвергается и не может что угодно можно делать

  • по иному просто никак, ну нужен тебе инстансинг например, нужен вот и всё, тянешь как расширение или идёшь в core profile где он есть.

А если хорошо покурить, что АПИ вулкана очень даже норм, хорошие доки(условно хорошие).

Да когда уже с чем то сработаешься то оно и становится норм уже из за привычки и полуавтоматических действий/мыслей =)

Просто надо взять это и обернуть в хорошо продуманную оборточку из абстракций

А без этого нигде никуда, часто нужны однотипные действия их так и так оборачивать, но один хрен их ещё написать надо =)

Вулкан просто другой, бомблю больше с этого. Ну_ИЭтотьВотВесь_ИтомуПодобныйБред_KHR(МНЕ,&тоже, HE,очень.НРАВИТСЯ);

LINUX-ORG-RU ★★ ()
Ответ на: комментарий от svyatozar

Лол, реально доменный паблик! Ну спасибо, в закладки добавил, как придётся изучать вулкан возьму как пример для разбирательств =)

LINUX-ORG-RU ★★ ()
Ответ на: комментарий от LINUX-ORG-RU

У Вулкана очень толковый API. Философия минимализма, при том что он «заточен» под Си++. Всё по полочкам: заполняешь структуру и вызываешь функцию. Никакого ООП не навязывается и нет препятствий оптимизации. Единственная трудность - это разобраться во всех компонентах «трубопровода».

svyatozar ★★ ()
Ответ на: комментарий от BceM_IIpuBeT

«Предлагаю добавить в прокрутку motion blur…» - а вот этого не надо.

svyatozar ★★ ()
Ответ на: комментарий от xmikex

«Зачем просмотрщику файлов Vulkan»?

Во-первых, это наглядный пример виджета. И потом: 2 треугольника, 2 шейдера. Тут уже очень мало что можно оптимизировать.

Я вот только не могу понять, почему он запускается 2-3 секунды. По идее не должно так долго запускаться…

svyatozar ★★ ()
Последнее исправление: svyatozar (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

по большому счету, все(самое основное) что поменялось в новых апи - это управление ресурсами вынесли на уровень пользователя. раньше дх11 и опегл сами все это делали, сейчас надо вручную менеджить и синхронизировать. оверхед появился только в юзер коде, в конечном же итоге программа будет работать как-то примерно так же. если надо было 2 шейдера чтобы отрисовать кубик, то эти же два шейдера и надо сейчас(если берем классический пайплайн).
Старое не развивается и отмирает за ненадобностью. в случае с этой программой, можно было вообще взять уже готовое сдк для гуя и смастерить что-то. но если мы говорим, допустим, про игры, то там надо использовать актуальные на момент технологии, а это дх12, вулкан, agc для плейстейшин, иначе некуда будет расти и некак улучшать графику. это я говорю про ААА игры. к слову, DXR(directX Raytracing api) прибито к Дх12, про опенгл я ничего не знаю, но подозреваю, что в нем тоже рейтресинг не реализован.
Тем более если дело касается изучения, то явно не стоит тратить время на опенгл, который не релизил новых версий 4 года и формально передал эстафетную палочку вулкану.

Keltir ()
Ответ на: комментарий от LINUX-ORG-RU

Самый торт это ядро OGL 3.3 и 4.3, всё остальное весьма противоречиво, т.к. код на 2.1 как правило всё равно пишут почти как на 3.3, а более ранние версии, так там сплошной изврат с расширениями позволяющими делать +- тоже самое, что можно в 2.1-3.3, достоинство 3.3 и 4.3 в том, что эти версии практически самодостаточны, т.к. в них включили считай все самые необходимые средства, а жесткий конвеер немасштабируется т.к. быстро исчерпывает себя в плане гибкости и производительности

AKonia ★★ ()

Долгожданный релиз. =)

Спасибо, интересно.

Quote ()
Ответ на: комментарий от AKonia

Нет, imHex совсем про другое. Оптимизации отображения и вывода там нет и в помине, даже наоборот.

Но проект тоже интересный и развивающийся, согласен.

Quote ()
Ответ на: комментарий от apt_install_lrzsz

«Так может это сам вулкан долго разгоняется. Это время проходит до того, как выполнение программы перейдёт в твой main()?»

2 секунды до main() и потом ещё секунда пока окно появится. Может это glfw3 + Wayland дают такой эффект? Пример на SDL2 запускается мнговенно, даже с кучей отладочной информации (без -DNDEBUG)

svyatozar ★★ ()
Ответ на: комментарий от mittorn

«А зачем тебе текстура если ты шрифт хранишь в юниформе?»

Скорее всего, осталась от кода примера. Я наверное не стал удалять на случай если снова вдруг понадобятся текстуры…

svyatozar ★★ ()
Ответ на: комментарий от AKonia

Лучше SDF шрефты сделать https://steamcdn-a.akamaihd.net/apps/valve/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf Быстро, надёжно, красиво, относительно просто. И что странно мало кто использует. Но у ТС шрифты попиксельные и выглядят хорошо, так что в принципе ненужно и твоё и моё предложение

LINUX-ORG-RU ★★ ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Странный способ изучать вулкан. Может лучше было бы какой нибудь кубик повращать?

kirill_rrr ★★★★★ ()
Ответ на: комментарий от LINUX-ORG-RU

Это разные подходы, у Грина - необычный способ интерполяции по текстуре в низком разрешении, представляющей собой поле расстояний отрисовывается более детализованная текстура-картинка, а в статье Лэнгеля(в которой кстати есть отсылка на упомянутую вами статью) в ней используется метод, который повышает качество векторных шрифтов и с помощью которого по сути отрисовкой символов по кривым занимается почти целиком ГПУ.

AKonia ★★ ()
Последнее исправление: AKonia (всего исправлений: 3)

Мои глаза! Каким говном ты рендеришь шрифты?

ox55ff ★★★★★ ()

Классно. Мне, к сожалению, нет особой надобности смотреть двоичные данные, но соберу просто потому, что красиво смотрится на скрине. Сравню, может повешу в mc на шифт+F3 вместо mcedit’а в бинарном режиме)

Dog ()

почему-то вспомнились анекдоты с недалекими персонажами и дурацкими вопросами...

Гуй встроен в шейдер.

а что без 3D не работает??

crypt ★★★★★ ()
Последнее исправление: crypt (всего исправлений: 1)
Ответ на: комментарий от Keltir

оверхед появился только в юзер коде

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

в конечном же итоге программа будет работать как-то примерно так же

Или быстрее за счёт отсутствия неявных барьеров (непересекающиеся записи в цепочке dispatch вызовов например), нормальной многопоточной записи и, например, асинхронного аплоада (а не как в этом древнем говне: «на следующей сточке кода текстура уже будет загружена»). Или медленнее за счёт оверсинхронизации и наивного управления очередями например (дх11 может местами сам включать компьют кью, в метале она включена всегда имплицитно).

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

С OpenGL/DX11 ты можешь учить «графон», а не бесконечные детали реализации производительного рендерера, имхо вопрос чему научится хочется.

Stil ★★★★★ ()
Ответ на: комментарий от LINUX-ORG-RU

OpenGL в промежутке от 2.1 до 3.3 в режиме совместимости.

Хмм.. У 3.3 ЕМНИП куда больше общего с 4, чем с 2. Всякие FBO, VAO, UBO, обязательность шейдеров, окончательное выкидывание мусора, вроде glLightfv на свалку, адекватный синтаксис шейдеров и вот это вот всё.

Ниже тлен, выше бред.

А что «бредового» в современном OpenGL?

А вообще никакое не нравится, они все говно. Мне нравятся лишь отдельные части общей архитектуры. Да и мне ли судить в принципе вулкан не знаю, метал не знаю, пару умерших уже не знаю, ниже 2,1 не знаю, выше 3,0 не знаю =)

Ясн.

robus ★★★★ ()
Ответ на: комментарий от LINUX-ORG-RU

При всём уважении это тупое выражение, требовать для вывода текста 450 шейдеров вместо 120 или даже 110 модно и молодёжно и работать будет на 3.5 железках

Лолчто? 4xx (Fermi) или новее, HD5000 (вроде Evergreen назывались) или новее, встройки Hasswell или новее – это нынче 3.5 железки? Очнитесь, 4.5 вышел 11 августа 2014 года – 7 лет назад.

по иному просто никак, ну нужен тебе инстансинг например, нужен вот и всё, тянешь как расширение или идёшь в core profile где он есть.

Core Profile отличается выкидыванием некролитов, а не добавлением ништячков.

robus ★★★★ ()
Ответ на: комментарий от robus

Путаетесь, всё перечисленное появилось не с 3.3, а после 1.5 - именно после неё случился переход на шейдеры(за рамками расширений) и код на 2.1 и 3.3 отличается в основном парой мелочей в шейдерах и способом указания расположения аттрибутов - в 2.1 явное, по имени(как с юниформами), а в 3.3 можно индексацией из шейдера. 3.3 отличается тем, что ввела разделение на профили корневой/совместимый, стандартизацией нескольких расширений(в частности шейдером геометрии и обратным вызовом по преобразованиям)

AKonia ★★ ()
Последнее исправление: AKonia (всего исправлений: 3)

Ого! Ну, я просто напомню, что чипы GPU зачастую не так уж и быстры на целых числах, а также про то, что фрагментный шейдер будет выполнен для каждого фрагмента (эдакого «протопикселя» – каждый фрагмент может стать или не стать пикселем в итоговом изображении в зависимости от параметров отсечения) сцены. Большое количество ветвлений наводит на мысли о том, что вряд ли драйвер сможет это за SIMD-ить, что может довольно сильно уронить производительность.

void mainLoop() {
	while(!glfwWindowShouldClose(window)) {
		glfwPollEvents();
		drawFrame();
		usleep(100000);
	}

	vkDeviceWaitIdle(device);
}

Это не то, чтоб суперкруто. Это режет не только фреймрейт (что и было целью, я полагаю), но и делает латентность инпута в наихудшем случае не меньше чем 100000 микросекунд = 0.1 секунды. Для хексвьюшки покатит, но в принципе 100 миллисекунд задержки перед обработкой ввода – это как бы дофига (особенно учитывая, что сама обработка ввода происходит тоже не мгновенно и что glfw имеет собственные задержки / накладные расходы).

robus ★★★★ ()

Лень в дебри вулкана лезть, чем текст рисуешь? Недавно для опенгл искал какие-то готовые решения, так там просто мрак и ужас.

vazgen05 ★★ ()
Ответ на: комментарий от vazgen05

С текстом всё просто. Шрифт хранится битмапом (fixed6x13koi.h).

255 символов, каждый символ 16 байт (можно и 13, но если сделать 16, то как раз один символ помещается в uvec4).

При отрисовке пикселя просто нужный бит выискивается из массива.

Это всё в шейдере shaders/shader.frag, шрифт подаётся униформ параметром

uvec4 fontdata[256];

Символ отрисовывается функцией print_koi():

void print_koi(uint letter, uint col, uint row, vec4 color) {
	uint word = ubo.fontdata[letter][row / 4];
	uint bytebit = 1 << (7 - col);
	uint wordbit = bytebit << (8 * (row % 4));
	uint val = word & wordbit;

	if(val != 0) {
		outColor = color;
	}
}
svyatozar ★★ ()
Последнее исправление: svyatozar (всего исправлений: 3)
Ответ на: комментарий от AKonia

Путаетесь, всё перечисленное появилось не с 3.3, а после 1.5

FBO – 3.0

VAO – 3.0, использование обязательно начиная с 3.3 Core Profile

UBO – 3.1

именно после неё случился переход на шейдеры (за рамками расширений)

В 1.5 не было шейдеров. Первые glsl шейдеры вошли в стандарт 2.0.

код на 2.1 и 3.3 отличается в основном парой мелочей в шейдерах и способом указания расположения аттрибутов - в 2.1 явное, по имени(как с юниформами), а в 3.3 можно индексацией из шейдера.

В 2.1 есть «встроенные атрибуты», «встроенные uniform-ы» и прочие, зачастую лишние вещи. В 3.3 от этого робко попытались избавиться, выпихнув в Compatibility Profile (который, к слову, в этой нашей месе ещё совсем недавно не поддерживался, и не полностью поддерживается до сих пор).

А вот код на 4.5 от 3.3 отличается незначительно. Разве что новые виды шейдеров появились, возможность указывать биндинги UBO прямо в шейдере, и всякие оптимизации / QOL вроде DSA.

robus ★★★★ ()

Гуй встроен в шейдер.

Ты знаешь же, да, что все инстансы вызова шейдера по умолчанию выполняются параллельно, но ветки if - одна за другой?

Сначала все шейдеры выполняются у которых true, а те у которых false - ждут. А потом наоборот

В GPGPU из-за этого люди прибегают к разным костылям, умножениям на ноль, итд лишь бы не делать ветвление

vertexua ★★★★★ ()
Последнее исправление: vertexua (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)