ZXMAK,
Можно взять пак с ромами+конфигами+профилями : https://volutar.myds.me/xpeccy/config.zip
Мне интересно будут ли вообще шейдеры работать на малинке, и как там со скоростью с ними...
ZXMAK,
Можно взять пак с ромами+конфигами+профилями : https://volutar.myds.me/xpeccy/config.zip
Мне интересно будут ли вообще шейдеры работать на малинке, и как там со скоростью с ними...
как проверить шейдеры в Xpeccy не знаю. А вообще работают, но медленее чем на игровых видеокартах.
sea.glsl примерно 3-5 fps:
Код:const int NUM_STEPS = 8; const float PI = 3.141592; const float EPSILON = 1e-3; #define EPSILON_NRM (0.1 / iResolution.x) // sea const int ITER_GEOMETRY = 3; const int ITER_FRAGMENT = 5; const float SEA_HEIGHT = 0.6; const float SEA_CHOPPY = 4.0; const float SEA_SPEED = 0.8; const float SEA_FREQ = 0.16; const vec3 SEA_BASE = vec3(0.1,0.19,0.22); const vec3 SEA_WATER_COLOR = vec3(0.8,0.9,0.6); #define SEA_TIME (1.0 + iGlobalTime * SEA_SPEED) const mat2 octave_m = mat2(1.6,1.2,-1.2,1.6); // math mat3 fromEuler(vec3 ang) { vec2 a1 = vec2(sin(ang.x),cos(ang.x)); vec2 a2 = vec2(sin(ang.y),cos(ang.y)); vec2 a3 = vec2(sin(ang.z),cos(ang.z)); mat3 m; m[0] = vec3(a1.y*a3.y+a1.x*a2.x*a3.x,a1.y*a2.x*a3.x+a3.y*a1.x,-a2.y*a3.x); m[1] = vec3(-a2.y*a1.x,a1.y*a2.y,a2.x); m[2] = vec3(a3.y*a1.x*a2.x+a1.y*a3.x,a1.x*a3.x-a1.y*a3.y*a2.x,a2.y*a3.y); return m; } float hash( vec2 p ) { float h = dot(p,vec2(127.1,311.7)); return fract(sin(h)*43758.5453123); } float noise( in vec2 p ) { vec2 i = floor( p ); vec2 f = fract( p ); vec2 u = f*f*(3.0-2.0*f); return -1.0+2.0*mix( mix( hash( i + vec2(0.0,0.0) ), hash( i + vec2(1.0,0.0) ), u.x), mix( hash( i + vec2(0.0,1.0) ), hash( i + vec2(1.0,1.0) ), u.x), u.y); } // lighting float diffuse(vec3 n,vec3 l,float p) { return pow(dot(n,l) * 0.4 + 0.6,p); } float specular(vec3 n,vec3 l,vec3 e,float s) { float nrm = (s + 8.0) / (PI * 8.0); return pow(max(dot(reflect(e,n),l),0.0),s) * nrm; } // sky vec3 getSkyColor(vec3 e) { e.y = max(e.y,0.0); return vec3(pow(1.0-e.y,2.0), 1.0-e.y, 0.6+(1.0-e.y)*0.4); } // sea float sea_octave(vec2 uv, float choppy) { uv += noise(uv); vec2 wv = 1.0-abs(sin(uv)); vec2 swv = abs(cos(uv)); wv = mix(wv,swv,wv); return pow(1.0-pow(wv.x * wv.y,0.65),choppy); } float map(vec3 p) { float freq = SEA_FREQ; float amp = SEA_HEIGHT; float choppy = SEA_CHOPPY; vec2 uv = p.xz; uv.x *= 0.75; float d, h = 0.0; for(int i = 0; i < ITER_GEOMETRY; i++) { d = sea_octave((uv+SEA_TIME)*freq,choppy); d += sea_octave((uv-SEA_TIME)*freq,choppy); h += d * amp; uv *= octave_m; freq *= 1.9; amp *= 0.22; choppy = mix(choppy,1.0,0.2); } return p.y - h; } float map_detailed(vec3 p) { float freq = SEA_FREQ; float amp = SEA_HEIGHT; float choppy = SEA_CHOPPY; vec2 uv = p.xz; uv.x *= 0.75; float d, h = 0.0; for(int i = 0; i < ITER_FRAGMENT; i++) { d = sea_octave((uv+SEA_TIME)*freq,choppy); d += sea_octave((uv-SEA_TIME)*freq,choppy); h += d * amp; uv *= octave_m; freq *= 1.9; amp *= 0.22; choppy = mix(choppy,1.0,0.2); } return p.y - h; } vec3 getSeaColor(vec3 p, vec3 n, vec3 l, vec3 eye, vec3 dist) { float fresnel = clamp(1.0 - dot(n,-eye), 0.0, 1.0); fresnel = pow(fresnel,3.0) * 0.65; vec3 reflected = getSkyColor(reflect(eye,n)); vec3 refracted = SEA_BASE + diffuse(n,l,80.0) * SEA_WATER_COLOR * 0.12; vec3 color = mix(refracted,reflected,fresnel); float atten = max(1.0 - dot(dist,dist) * 0.001, 0.0); color += SEA_WATER_COLOR * (p.y - SEA_HEIGHT) * 0.18 * atten; color += vec3(specular(n,l,eye,60.0)); return color; } // tracing vec3 getNormal(vec3 p, float eps) { vec3 n; n.y = map_detailed(p); n.x = map_detailed(vec3(p.x+eps,p.y,p.z)) - n.y; n.z = map_detailed(vec3(p.x,p.y,p.z+eps)) - n.y; n.y = eps; return normalize(n); } float heightMapTracing(vec3 ori, vec3 dir, out vec3 p) { float tm = 0.0; float tx = 1000.0; float hx = map(ori + dir * tx); if(hx > 0.0) return tx; float hm = map(ori + dir * tm); float tmid = 0.0; for(int i = 0; i < NUM_STEPS; i++) { tmid = mix(tm,tx, hm/(hm-hx)); p = ori + dir * tmid; float hmid = map(p); if(hmid < 0.0) { tx = tmid; hx = hmid; } else { tm = tmid; hm = hmid; } } return tmid; } // main void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 uv = fragCoord.xy / iResolution.xy; uv = uv * 2.0 - 1.0; uv.x *= iResolution.x / iResolution.y; float time = iGlobalTime * 0.3 + iMouse.x*0.01; // ray vec3 ang = vec3(sin(time*3.0)*0.1,sin(time)*0.2+0.3,time); vec3 ori = vec3(0.0,3.5,time*5.0); vec3 dir = normalize(vec3(uv.xy,-2.0)); dir.z += length(uv) * 0.15; dir = normalize(dir) * fromEuler(ang); // tracing vec3 p; heightMapTracing(ori,dir,p); vec3 dist = p - ori; vec3 n = getNormal(p, dot(dist,dist) * EPSILON_NRM); vec3 light = normalize(vec3(0.0,1.0,0.8)); // color vec3 color = mix( getSkyColor(dir), getSeaColor(p,n,light,dir,dist), pow(smoothstep(0.0,-0.05,dir.y),0.3)); // post fragColor = vec4(pow(color,vec3(0.75)), 1.0); }Код:glXQueryVersion: 1.4 Version: 3.1 Mesa 23.2.1-1~bpo12+rpt3 Renderer: V3D 4.2 Vendor: Broadcom GL: 3.1 GLSL: 1.40 AA: 0 Color: 32 Depth: 24 Stencil: 0 ShaderVersion: 1.40
Вообще графика в Raspios Bookworm с Wayland Wayfire замечательная. У меня включен Wayfire плагины cube и wobbly (виляющие окна, окна ведут себя как резиновые, болтаются и покачиваются, иммитируя резиновую физику, когда мышкой подхватываешь и тянешь), эффекты плавные и приятные глазу, при этом на производительности это не сказывается.
Брал RPI4 4G попробовать для сигнальной обработки, но вот уже год сижу на ней как не десктопе, т.к. нормальный комп или ноут сейчас приобрести нет возможности. Для разработки конечно слабовато, но geany вполне себе шустро работает. А инет читать и видео смотреть отлично. Единственное что с HD и UHD разрешениями могут быть проблемы с лагами если формат не H264.
У RPI5 процессор и GPU примерно в два раза быстрей, правда с другой стороны убрали аппаратное ускорение H264, но зато добавили аппаратное ускорение для шифрования. Думаю на RPI5 этот-же шейдер будет давать порядка 6-10 fps.
Последний раз редактировалось ZXMAK; 06.09.2024 в 02:21.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
CityAceE(06.09.2024)
ZXMAK, не, в Xpeccy (без S) пиксельные шейдеры в opengl режиме имеются, для имитации crt (какой-никакой). В паке с конфигами по моей ссылке. Но судя по скрину - собрана не GL версия, а с софтовым рендером и масштабированием.
Последний раз редактировалось Dexus; 06.09.2024 в 01:59.
Хм, ccmake не видит опции для GL:
Добавил вручную cmake -DUSEOPENGL=1, собралось но падает при запуске:Код:CMAKE_BUILD_TYPE CMAKE_INSTALL_PREFIX /usr/local Qt5Core_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5Core Qt5Gui_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5Gui Qt5Widgets_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5Widgets Qt5_DIR /usr/lib/aarch64-linux-gnu/cmake/Qt5 SDL2MAIN_LIBRARY /usr/lib/aarch64-linux-gnu/libSDL2main.a SDL2_INCLUDE_DIR /usr/include/SDL2 SDL2_LIBRARY /usr/lib/aarch64-linux-gnu/libSDL2main.a;/usr/lib/aarch64-linux-gnu/libSDL2.so
видимо какая-то ошибка с неправильным вызовом QImage::QImage или до этого где-то память повредиласьКод:$ gdb ./xpeccy GNU gdb (Debian 13.1-3) 13.1 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "aarch64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./xpeccy... (No debugging symbols found in ./xpeccy) (gdb) run Starting program: /home/pi/ZX/Xpeccy/build/xpeccy [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1". [New Thread 0x7ff271f040 (LWP 518305)] [New Thread 0x7ff1c26040 (LWP 518306)] Using SDL ver 2.26.5 Using ZLIB ver 1.2.13 Using Qt ver 5.15.8 [New Thread 0x7fed43a040 (LWP 518307)] [New Thread 0x7fecc2a040 (LWP 518308)] [New Thread 0x7fdf3cf040 (LWP 518311)] [Thread 0x7fdf3cf040 (LWP 518311) exited] [New Thread 0x7fdf3cf040 (LWP 518312)] [New Thread 0x7fdebbf040 (LWP 518313)] [Thread 0x7fdf3cf040 (LWP 518312) exited] [New Thread 0x7fdf3cf040 (LWP 518314)] [New Thread 0x7fde38a040 (LWP 518315)] [Thread 0x7fdf3cf040 (LWP 518314) exited] [Thread 0x7fdebbf040 (LWP 518313) exited] [New Thread 0x7fdebbf040 (LWP 518316)] [New Thread 0x7fdf3cf040 (LWP 518317)] [Thread 0x7fdebbf040 (LWP 518316) exited] [Thread 0x7fde38a040 (LWP 518315) exited] [Thread 0x7fdf3cf040 (LWP 518317) exited] [New Thread 0x7fdf3cf040 (LWP 518319)] SDL audio device opening...success: 48000 960 (32784 / 32784) constructor Joystick not opened [New Thread 0x7fde38a040 (LWP 518324)] [New Thread 0x7fdebbf040 (LWP 518325)] end:constructor [New Thread 0x7fca7be040 (LWP 518326)] [New Thread 0x7fbbbde040 (LWP 518329)] initializeGL vtx_shd frg_shd end: initializeGL qt.qpa.wayland: Wayland does not support QWindow::requestActivate() [New Thread 0x7fbb21f040 (LWP 518330)] Thread 1 "xpeccy" received signal SIGSEGV, Segmentation fault. 0x0000007ff708c018 in QImage::QImage(QImage const&) () from /lib/aarch64-linux-gnu/libQt5Gui.so.5 (gdb)
Update: вот с callstack:
Дело не в OpenGL, сам OpenGL прекрасно работает.Код:(gdb) bt #0 0x0000007ff708c018 in QImage::QImage(QImage const&) () at /lib/aarch64-linux-gnu/libQt5Gui.so.5 #1 0x0000007fed9c3ed4 in QtWaylandClient::QWaylandShmBackingStore::toImage() const () at /lib/aarch64-linux-gnu/libQt5WaylandClient.so.5 #2 0x0000007ff7330d20 in QPlatformBackingStore::toTexture(QRegion const&, QSize*, QFlags<QPlatformBackingStore::TextureFlag>*) const () at /lib/aarch64-linux-gnu/libQt5Gui.so.5 #3 0x0000007ff7330724 in QPlatformBackingStore::composeAndFlush(QWindow*, QRegion const&, QPoint const&, QPlatformTextureList*, bool) () at /lib/aarch64-linux-gnu/libQt5Gui.so.5 #4 0x0000007ff7739b18 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #5 0x0000007ff773b2ec in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #6 0x0000007ff773d720 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #7 0x0000007ff77706d0 in QWidget::event(QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #8 0x0000007ff772c0a0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #9 0x0000007ff6c39d60 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #10 0x0000007ff773e374 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #11 0x0000007ff7740960 in () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #12 0x0000007ff77594dc in QWidget::repaint(QRect const&) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #13 0x0000007ff775954c in QWidget::repaint() () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #14 0x00000055556174f0 in MainWin::frame_timer() (this=0x7fffffd240) at /home/pi/ZX/Xpeccy/src/emulwin.cpp:621 #15 0x0000007ff6c76628 in () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #16 0x0000007ff6c7ac40 in QTimer::timeout(QTimer::QPrivateSignal) () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #17 0x0000007ff6c6a5e4 in QObject::event(QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #18 0x0000007ff772c0a0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Widgets.so.5 #19 0x0000007ff6c39d60 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #20 0x0000007ff6c98d80 in QTimerInfoList::activateTimers() () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #21 0x0000007ff6c996ec in () at /lib/aarch64-linux-gnu/libQt5Core.so.5 --Type <RET> for more, q to quit, c to continue without paging-- #22 0x0000007ff521774c in g_main_context_dispatch () at /lib/aarch64-linux-gnu/libglib-2.0.so.0 #23 0x0000007ff52179e0 in () at /lib/aarch64-linux-gnu/libglib-2.0.so.0 #24 0x0000007ff5217a84 in g_main_context_iteration () at /lib/aarch64-linux-gnu/libglib-2.0.so.0 #25 0x0000007ff6c99ac8 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #26 0x0000007ff6c38278 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #27 0x0000007ff6c412fc in QCoreApplication::exec() () at /lib/aarch64-linux-gnu/libQt5Core.so.5 #28 0x000000555560f060 in main(int, char**) (ac=<optimized out>, av=0x7fffffefb8) at /home/pi/ZX/Xpeccy/src/main.cpp:307
Последний раз редактировалось ZXMAK; 06.09.2024 в 03:30.
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
ZXMAK, видимо что-то с qtGL не правильно делается. Там индикаторы (иконки/надписи) поверху GL контекста должны отрисовываются. И там изначально пришлось пожонглировать порядком создания/инициализации чтобы все отрисовывалось. Возможно с этим что-то не так. А может и с Legacy, который с добавленим qt6 добавили. Можно попробовать собрать версию годичной давности.
не совсем понятно, а зачем для этого QT? ведь иконки проще напрямую в GL отрендерить
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)