LINUX.ORG.RU

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

 , , , ,


3

1

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

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

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

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

https://github.com/alexkh/shex

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

★★

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

FBO – 3.0

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

UBO – 3.1

Виноват, их не было, попутал

В 1.5 не было шейдеров

Я и сказал после, а не с

В 2.1 есть «встроенные атрибуты», «встроенные uniform-ы» и прочие, зачастую лишние вещи.

Но в целом в шейдерах не сильно что изменилось, более того даже в core 330 режиме glsl переваривает многие встроенные переменные 2.1 версии

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

Но в целом в шейдерах не сильно что изменилось

Использование UBO, вместо обычных uniform-ов довольно значимое изменение.

более того даже в core 330 режиме glsl переваривает многие встроенные переменные 2.1 версии

Вообще стандарт как бы запрещает, но многие драйверы «на пофиг» продолжают молотить невалидный клиентский код. К тому же не все встроенные переменные выпилили. А только те, что связаны с устаревшим мусором. Всякие gl_FragCoord, gl_Position и т.п. никуда не делись и после 3.3.

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

Конечно, дивергенция веток влияет на производительность. Однако, далеко не в каждой ситуации время, потраченное на оптимизацию окупится выигрышем в производительности. Кроме того, придётся пожертвовать читабельностью, а это тоже немаловажный фактор для тех, кто захочет использовать код в своих проектах.

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

Судя по тому, что многие работы с https://www.shadertoy.com/ шустро работают на встроенных видеоадаптерах, запас производительности там уже настолько большой, что можно рисовать по пикселям достаточно ветвистые сцены.

i-rinat ★★★★★
()
Ответ на: комментарий от fooser

Благодарю, но где там улучшения? Вместо самодостаточного запускаемого файла, вы делаете запускаемый файл, к которому надо ещё два файла в субдиректории.

Оправдана ли зависимость от GNU Make, когда скрипт сборки состоит из одной строчки?

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

А он там не в лупе. Он только при пересоздании swapchain и при выходе из mainLoop. При пересоздании swapchain – нужен, поскольку мы производим удаление ресурса и нам нужно быть уверенными, что GPU не использует его в данный момент. Единственный способ это сделать – vkDeviceWaitIdle. На выходе из mainLoop – тоже, поскольку потом будет производиться удаление всех созданных ресурсов. TC решил, что будет звать vkDeviceWaitIdle сразу после выхода из while, вместо void cleanup(), где было бы слегка логичнее и закрывалось бы приложение эдак на 10 миллисекунд быстрее.

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

угу, я просмотрел, что он за лупом вызывается, все верно написали. пора домой идти наверное :3

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

Благодарю.

Всё-таки решил попробовать делать отрисовку окна только когда меняется содержимое. В Вейланде работает. Надо будет потестировать в X11… Я пока не придумал как это проверить на своём компе, ведь glfw компилируется либо под X11 либо под Вейланд…

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

|| vulkan, gl? зачем это все, когда тоже самое достигается простым «hexdump | less»

Ну а где там линейка прокрутки?

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

Линейкой прокрутки ты скроллбар называешь? Так она не нужна, less спокойно показывает нужную инфу через стоку статуса

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

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

ananas ★★★★★
()
Ответ на: комментарий от ananas
  1. Скроллбар позволяет мышкой прокручивать файл до нужного места.

  2. Разработка графических интерфейсов - вполне себе полезное занятие. Учитывая что в С++ до сих пор нет толковой библиотеки графического интерфейса.

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

|| не осилил мейкфайл

Зачем мне твой Мейкфайл, когда есть Ninja?

svyatozar ★★
() автор топика

Заменил-таки GLFW3 на SDL2. Теперь программа запускается гораздо быстрее! Кроме того, чтобы запустить программу как Вейланд-клиент, теперь можно просто передать ей глобальную переменную:

SDL_VIDEODRIVER=wayland ./shex shaders/frag.spv

Кроме того, SDL2 правильно выставляет app_id:

         "app_id": "shex",

который можно использовать в фильтрах настроек Sway. Например, по умолчанию у меня окна без заголовков, но для shex я хочу чтобы заголовок отображался. Теперь я могу добавить такую строчку в ~./config/sway/config:

for_window [app_id=«shex»] border normal 1

Раньше это было невозможно, потому что GLFW3 не настолько продвинут чтобы выставлять app_id.

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

Цвета задаются в шейдере shaders/shader.frag: vec4(Red, Green, Blue, Alpha), каждая компонента от 0 до 1.

Цвета букв в зависимости от значения байта:

vec4 lettercolor(uint letter) {
	vec4 color = vec4(0.8, 0.8, 0.0, 1.0);
	if(letter == 0) {
		color = vec4(0.0, 0.0, 0.9, 1.0);
	} else if(letter < 32) {
		color = vec4(0.0, 0.6, 0.6, 1.0);
	} else if(letter < 128) {
		color = vec4(0.8, 0.8, 0.8, 1.0);
	} else if(letter < 192) {
		color = vec4(1.0, 0.5, 0.0, 1.0);
	}
	return color;
}

Фон нечётных строк:

		outColor = vec4(0.0, 0.012, 0.0, 1.0);

Цвета текста вверху задаются в разделе //topbox

		vec4 color = vec4(0.6, 0.6, 0.3, 1.0);

Цвета текста слева - в разделе // addrbox

		vec4 color = vec4(0.6, 0.6, 0.3, 1.0);
		if(addr % 256 == 0) {
			color = vec4(0, 0.5, 0.0, 1.0);
		}

Шейдер надо будет потом скомпилировать командой ./shmk После этого ./mk

Для компиляции шейдеров нужна утилита xxd, которая бинарник преобразует в текстовый файл frag.h

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

Сегодня наконец дошли руки до мастдая. Сделал сборку и протестировал на винде 10.

Вот дистрибутив: https://wizstaff.com/winshex.zip

svyatozar ★★
() автор топика

Сегодня мне удалось запустить эту программу на мастдае со старым железом (видеокарта, выпущенная до 2011 года) используя mesa 3d lavapipe swrast - драйвер, который растеризует используя центральный процессор.

Для этого был скачан драйвер отсюда: https://github.com/pal1000/mesa-dist-win/releases/tag/21.3.1

Прямая ссылочка на файл: https://github.com/pal1000/mesa-dist-win/releases/download/21.3.1/mesa3d-21.3.1-release-msvc.7z

После распаковки на десктоп, чтобы использовать этот драйвер, я установил переменную VK_ICD_FILENAMES=c:\Users\sv\Desktop\mesa3d-21.3.1-release-msvc\x64\lvp_icd.x86_64.json

и после этого запустил приложения:

shex.exe shex.exe

Вот скриншот:

https://wizstaff.com/win_shex_lavapipe.png

Так же, мне удалось испытать это приложение через lavapipe на raspberry pi 4 (в Манжаро просто устанавливается vulkan-swrast - пока существует только 64-битная версия). По идее, в нём железо должно поддерживать Вулкан, но я пока не нашёл соответствующий драйвер. В принципе, сам факт что программа работает на таких разных платформах уже хорошая новость, ведь это значит что графический пользовательский интерфейс на Вулкане вовсе не ограничивает использование программы исключительно на новых видеокартах, как это было совсем недавно!

svyatozar ★★
() автор топика
Последнее исправление: svyatozar (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.