vkQuake is a Quake 1 port using Vulkan instead of OpenGL for rendering

🌋 vkQuake

vkQuake is a Quake 1 port using Vulkan instead of OpenGL for rendering. It is based on the popular QuakeSpasm port and runs all mods compatible with it like Arcane Dimensions. Due to the port using Vulkan and other optimizations it can achieve much better frame rates.

Compared to QuakeSpasm vkQuake also features a software Quake like underwater effect, has better color precision, generates mipmap for water surfaces at runtime and has native support for anti-aliasing and AF. Furthermore frame rates above 72FPS do not break physics.

vkQuake also serves as a Vulkan demo application that shows basic usage of the API. For example it demonstrates render passes & sub passes, pipeline barriers & synchronization, compute shaders, push & specialization constants, CPU/GPU parallelism and memory pooling.

Building

Windows

Prerequisites:

Start Git Bash and clone the vkQuake repo:

git clone https://github.com/Novum/vkQuake.git

Visual Studio

Install Visual Studio Community with Visual C++ component.

Open the Visual Studio solution, Windows\VisualStudio\vkquake.sln, select the desired configuration and platform, then build the solution.

MinGW

Download the latest release of MinGW-w64 and install it:

  • 32 bit:
    • Architecture: i686
    • Install location: C:\mingw-w32
  • 64 bit:
    • Architecture: x86_64
    • Install location: C:\mingw-w64

Also install the latest release of MozillaBuild with default settings.

Start MSYS with c:\mozilla-build\msys\msys.bat and compile vkQuake.

32 bit:

cd vkQuake/Quake
export PATH=${PATH}:/c/mingw-w32/mingw32/bin
make USE_SDL2=1 -f Makefile.w32

64 bit:

cd vkQuake/Quake
export PATH=${PATH}:/c/mingw-w64/mingw64/bin
make USE_SDL2=1 -f Makefile.w64

Linux

Make sure that both your GPU and your GPU driver supports Vulkan.

To compile vkQuake, first install the build dependencies:

Ubuntu:

apt-get install git make gcc libsdl2-dev libvulkan-dev libvorbis-dev libmad0-dev libx11-xcb-dev

Arch Linux:

pacman -S git flac glibc libgl libmad libvorbis libx11 sdl2 vulkan-validation-layers

* Please note that for vkquake > v0.50, you will need at least v1.0.12.0 of libvulkan-dev (See #55).

Then clone the vkQuake repo:

git clone https://github.com/Novum/vkQuake.git

Now go to the Quake directory and compile the executable:

cd vkQuake/Quake
make

Note

vkQuake 0.97 and later requires at least SDL2 2.0.6 with enabled Vulkan support. The precompiled versions in some of the distribution repositories (e.g. Ubuntu) do not currently ship with Vulkan support. You will therefore need to compile it from source. Make sure you have libvulkan-dev installed before running configure.

MacOS

To compile vkQuake, first install the build dependencies with Homebrew:

brew install molten-vk vulkan-headers sdl2 libvorbis flac mad

Then clone the vkQuake repo:

git clone https://github.com/Novum/vkQuake.git

Now go to the Quake directory and compile the executable:

cd vkQuake/Quake
make

Usage

Quake has 4 episodes that are split into 2 files:

  • pak0.pak: contains episode 1
  • pak1.pak: contains episodes 2-4

These files aren't free to distribute, but pak0.pak is sufficient to run the game and it's freely available via the shareware version of Quake. Use 7-Zip or a similar file archiver to extract quake106.zip/resource.1/ID1/PAK0.PAK. Alternatively, if you own the game, you can obtain both .pak files from its install media.

Now locate your vkQuake executable, i.e. vkQuake.exe on Windows or vkquake on Ubuntu. You need to create an id1 directory next to that and copy pak0.pak there, e.g.:

  • Windows: Windows\VisualStudio\Build-vkQuake\x64\Release\id1\pak0.pak
  • Ubuntu: Quake\id1\pak0.pak

Then vkQuake is ready to play.

Optional - Music / Soundtrack

The original quake had a great soundtrack by Nine Inch Nails. Unfortunately, the Steam version does not come with the soundtrack files. The GOG-provided files need to be converted before they are ready for use. In general, you'll just need to move a "music" folder to the correct location within your vkQuake installation (.e.g /usr/share/quake/id1/music). Most Quake engines play nicest with soundtracks placed in the id1/music subfolder vs. sound\cdtracks

QuakeSpasm, the engine vkQuake is derived from, supports OGG, MP3, FLAC, and WAV audio formats. The Linux version of QuakeSpasm/VkQuake requires external libraries: libogg or libvorbis for OGG support, libmad or libmpg123 for MP3, and libflac for FLAC. If you already have a setup that works for the engine you're currently using, then you don't necessarily have to change it.

To convert the WAV files to FLAC, run this command with libflac and sox installed in a directory containing the WAV files:

for f in *.wav; do sox "$f" "${f%.wav}.flac"; done

Generally, the below setup works for multiple engines, including Quakespasm/vkQuake:

  • The music files are loose files, NOT inside a pak or pk3 archive.
  • The files are placed inside a "music" subfolder of the "id1" folder. For missionpack or mod soundtracks, the files are placed in a "music" subfolder of the appropriate game folder. So the original Quake soundtrack files go inside "id1\music", Mission Pack 1 soundtrack files go inside "hipnotic\music", and Mission Pack 2 soundtrack files go inside "rogue\music".
  • The files are named in the pattern "tracknn", where "nn" is the CD track number that the file was ripped from. Since the soundtrack starts at the second CD track, MP3 soundtrack files are named "track02.mp3", "track03.mp3", etc. OGG soundtrack files are named "track02.ogg", "track03.ogg", etc. FLAC soundtrack files are named "track02.flac", "track03.flac", etc. WAV soundtrack files are named "track02.wav", "track03.wav", etc.

See more: Quake Soundtrack Solutions (Steam Community)

Owner
Comments
  • Add support for the 2021 re-release

    Add support for the 2021 re-release

    This fixes crashes with the 2021 re-release and adds basic support for localized strings so that the new maps display proper messages instead of text id's. Localization data is read from a loc_english.txt file in the mod directory, in the same format as the files in the localization folder in the rerelease/QuakeEX.kpf zip archive. Currently the files need to be copied manually - adding code to read zip files just for this feature seemed like feature creep, and can be added later if necessary.

    @sezero, I'm hoping this can also be merged into QS, can you please have a look?

  • Bug: Specific rendered content or high FPS causes microstuttering

    Bug: Specific rendered content or high FPS causes microstuttering

    I can see the microstuttering when looking at the frametime graph of RTSS.

    It results in visual freezes and all sorts of clipping audio, already when letting the standard demo play out.

    I could confirm it was isolated to vkQuake as a source port since Ironwail isn't exhibiting the same issues.

    In case it plays a role, I'm letting the framerate run free (mainly for input lag purposes), and using a GTX 1080 that means between 1500-2500 FPS.

    CPU: AMD Ryzen 3600

  • Re-release Update Today Causes Text Not to Display

    Re-release Update Today Causes Text Not to Display

    Quake on steam had an update today: https://steamdb.info/patchnotes/8507405/

    After that, the text on-screen is no longer displaying. The most obvious example is the difficulty portals, where they normally display and make a sound, only the sound happens, not the text.

    Attached is a log of it running: quake.log

  • x86 mingw binaries  crash

    x86 mingw binaries crash

    following the discussion in https://github.com/Novum/vkQuake/commit/1491afe777ffdefc65e5ce81b5005a3742547484#comments x86 mingw binaries crash immediately after map load (cl_startdemos 0) Binaries without any optimizations -O1 or -O2 run fine. Crash introduced first somewhere between 1.13.0 and 1.13.1

    here is a backtrace ( -g -O2 ) current git master

    Thread 8 received signal SIGSEGV, Segmentation fault.
    [Switching to Thread 26248.0x6d94]
    R_DrawAliasModel ([email protected]=0x307938 <vulkan_globals+1311064>, e=0x4fe7f40) at r_alias.c:470
    470                             tx = playertextures[i - 1];
    (gdb) bt
    #0  R_DrawAliasModel ([email protected]=0x307938 <vulkan_globals+1311064>,
        e=0x4fe7f40) at r_alias.c:470
    #1  0x0008290c in R_DrawEntitiesOnList (
        cbx=0x307938 <vulkan_globals+1311064>, [email protected]=false)
        at gl_rmain.c:450
    #2  0x00082e8a in R_DrawEntitiesOnList (alphapass=false, cbx=<optimized out>)
        at gl_rmain.c:424
    #3  R_DrawEntitiesTask (unused=0x1532cf4 <tasks+2036>) at gl_rmain.c:709
    #4  0x0013d8d0 in Task_Worker (data=<optimized out>) at tasks.c:245
    #5  0x6c37630a in SDL_wcsstr () from C:\Games\vkquake_x86\SDL2.dll
    #6  0x6c376fe3 in SDL_wcsstr () from C:\Games\vkquake_x86\SDL2.dll
    #7  0x6c37700b in SDL_wcsstr () from C:\Games\vkquake_x86\SDL2.dll
    #8  0x76b06cff in msvcrt!_beginthreadex () from C:\Windows\SysWOW64\msvcrt.dll
    #9  0x76b06dc1 in msvcrt!_endthreadex () from C:\Windows\SysWOW64\msvcrt.dll
    #10 0x776efa29 in KERNEL32!BaseThreadInitThunk ()
       from C:\Windows\SysWOW64\kernel32.dll
    #11 0x77b27a7e in ntdll!RtlGetAppContainerNamedObjectPath ()
       from C:\Windows\SysWOW64\ntdll.dll
    #12 0x77b27a4e in ntdll!RtlGetAppContainerNamedObjectPath ()
       from C:\Windows\SysWOW64\ntdll.dll
    #13 0x00000000 in ?? ()
    (gdb) frame
    #0  R_DrawAliasModel ([email protected]=0x307938 <vulkan_globals+1311064>,
        e=0x4fe7f40) at r_alias.c:470
    470                             tx = playertextures[i - 1];
    
    
  • Texture transparency doesn't work properly

    Texture transparency doesn't work properly

    System specifications

    OS - Arch Linux (rolling) GPU - Radeon RX 5500M & AMD Renoir (integrated graphics) Vulkan drivers - RADV (part of Mesa graphics libraries) CPU - Ryzen 7 4800H with Radeon Graphics

    vkquake version - latest git commit

    Bug

    Texture transparency only works when viewing textures under certain angles, as shown in Alkaline's start map. Screenshot from 2022-05-28 08-57-37 Screenshot from 2022-05-28 08-57-40

    Reproduction

    1. Load Alkaline's start map
    2. See that the windows are opaque
    3. Turn right until the windows become transparent.
  • Arcane Dimensions: Stuttering on elevators

    Arcane Dimensions: Stuttering on elevators

    Hi, I noticed that there is some ugly stuttering when moving on elevators - especially in Arcane Dimensions "The Crucial Error" map but also in some others. As if the camera sinks bellow the elevator plate randomly. I thought this is due to my 144Hz refresh but it behaves the same at 60 or 72 FPS. It is also present in vanilla Quakespasm but the Spiked fork (QSS) is completelly smooth in this regard. Is there some tweak that can be ported from QSS to vkQuake? QSS runs OK most of the time but has performance/resources utilization problems on large maps just like vanilla Quakespasm. vkQuake runs absolutelly stunning with everything I throw at it!

    Here are saves from the map before an elevator (Arcane Dimensions 1.8 patch 1). s18.zip s19.zip

  • Fullscreen mode - Shaking (Linux)

    Fullscreen mode - Shaking (Linux)

    Hi,

    when I enter into Fullscreen mode, the screen begins to shake (up and down) on a period of about 0.5s. Sound also clips are the screen does.

    When I leave Fullscreen mode, the HUD is not fully viewable (health/armour is offscreen).

    Resolution is 21:9 2560 by 1080p V-Sync on/off does nothing Vkquake v1.04.1

  • Game freezing on startup as of version 1.20.x

    Game freezing on startup as of version 1.20.x

    As of release 1.20.0 up to 1.20.2 game is freezing upon startup. Reverting to 1.13.1 works fine.

    Between 1.13.1 and the new release, the only thing that I see different in terminal are these 3 lines:

    Unknown command "gl_subdivide_size" Unknown command "gl_triplebuffer" Unknown command "vid_bpp"

    1

  • [Bug] Certain (water) surfaces move depending on camera angle

    [Bug] Certain (water) surfaces move depending on camera angle

    System info

    OS - Arch Linux (rolling) GPU - Radeon RX 5500M & AMD Renoir (integrated graphics) CPU - Ryzen 7 4800H with Radeon Graphics

    vkquake version - 1.11.1

    Bug

    Certain water surfaces move depending on your camera angle. I also have seen other surfaces behave like that. This is a graphical glitch.

    Reproduction

    HIP1M2 is a good place where this is potentially reproducible.

    1. Load HIP1M2
    2. Go to an area with water
    3. Start looking around in different ways
    4. See how the surfaces move.

    Examples in HIP1M2

    Screenshot from 2021-11-13 20-33-18 Screenshot from 2021-11-13 20-33-23 Screenshot from 2021-11-13 20-34-28

    Example in alk_bdown (mod Alkaline)

    Screenshot from 2021-11-13 20-27-15 Screenshot from 2021-11-13 20-27-21

  • Long black screen before game starts with 1.22.3 AppImage

    Long black screen before game starts with 1.22.3 AppImage

    Executing the AppImage for the latest release, I get a black screen that goes on for about 30 seconds or so before the game launches. This issue is not present with the 1.22.1 version. I'm running Arch with Zen Kernel 6.0.12.

    Here's the terminal output I get with 1.22.3:

    Found SDL version 2.26.1
    Detected 12 CPUs.
    Initializing vkQuake v1.22.3
    Built with GCC 7.5.0
    Host_Init
    Playing registered version.
    Console initialized.
    UDP4 Initialized
    UDPv6 Initialized
    Server using protocol 999+ (FTE-RMQ)
    Exe: 08:11:47 Dec 12 2022
    
    Vulkan Initialization
    Using Vulkan 1.1
    Instance extensions:
     VK_KHR_surface
     VK_KHR_xlib_surface
     VK_KHR_get_surface_capabilities2
     VK_KHR_get_physical_device_properties2
    
    Vendor: AMD
    Device: AMD Radeon RX 6700 XT (RADV NAVI22)
    Driver: radv Mesa 22.2.3
    Using subgroup operations
    Device extensions:
     VK_KHR_swapchain
     VK_KHR_get_memory_requirements2
     VK_KHR_dedicated_allocation
     VK_EXT_subgroup_size_control
    Using A2B10G10R10 color buffer format
    Using D32_S8 depth buffer format
    
    Creating command buffers
    Initializing staging
    Creating descriptor set layouts
    Reallocating dynamic VBs (256 KB)
    Reallocating dynamic IBs (1024 KB)
    Reallocating dynamic UBs (256 KB)
    Initializing samplers
    Texture lod bias: 0.000000
    Creating pipeline layouts
    ioctl (GFEATURE): Broken pipe
    ioctl (GFEATURE): Broken pipe
    ioctl (GFEATURE): Connection timed out
    ioctl (GFEATURE): Connection timed out
    ioctl (GFEATURE): Connection timed out
    ioctl (GFEATURE): Connection timed out
    ioctl (GFEATURE): Connection timed out
    ioctl (GFEATURE): Connection timed out
    detected controller: Xbox Series X Controller
    Allocating lightstyles buffer (0 KB)
    Allocating lights buffer (4 KB)
    
    Sound Initialization
    Using IMMEDIATE present mode
    Creating color buffer
    AA disabled
    Creating depth buffer
    Creating render passes
    Creating frame buffers
    Creating pipelines
    SDL audio spec  : 44100 Hz, 1024 samples, 2 channels
    SDL audio driver: pulseaudio - Razer USB Sound Card Analog Stereo, 65536 bytes buffer
    Audio: 16 bit, stereo, 44100 Hz
    CDAudio disabled at compile time
    
    Language initialization
    Couldn't load 'localization/loc_english.txt'
    from '/home/peter/Downloads/AppImages/vkQuake'
    
    ========= Quake Initialized =========
    
    execing quake.rc
    Using IMMEDIATE present mode
    Creating color buffer
    AA disabled
    Creating depth buffer
    Creating render passes
    Creating frame buffers
    Creating pipelines
    Initializing samplers
    Texture lod bias: 0.000000
    execing default.cfg
    execing config.cfg
    Initializing samplers
    Texture lod bias: 0.000000
    execing autoexec.cfg
    3 demo(s) in loop
    Playing demo from demo1.dem.
    
    
    
    the Necropolis
    Using protocol 15
    Allocating lightmap compute surface data (332 KB)
    Allocating indirect draw data (1 KB, 72 draws)
    Allocating indirect IBs (170 KB)
    Allocating visibility buffers (1 KB)
    You got the shells
    You got the Grenade Launcher
    You receive 25 health
    You get 2 rockets  
    Reallocating dynamic VBs (512 KB)
    You got the rockets
    Using IMMEDIATE present mode
    Creating color buffer
    AA disabled
    Creating depth buffer
    Creating render passes
    Creating frame buffers
    Creating pipelines
    Initializing samplers
    Texture lod bias: 0.000000
    You got the nailgun
    Shutting down SDL sound
    
  • Failure to compile with GCC 12.1

    Failure to compile with GCC 12.1

    Using master as of the date of this report.

    Compilation fails on this, GCC 12.1, openSUSE Tumbleweed:

    tasks.c: In function ‘Tasks_Init’:
    tasks.c:297:55: error: writing 16 bytes into a region of size 0 [-Werror=stringop-overflow=]
      297 |                 steal_worker_indices[i + num_workers] = i;
          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
    tasks.c:87:24: note: at offset 64 into destination object ‘steal_worker_indices’ of size 64
       87 | static uint8_t         steal_worker_indices[MAX_WORKERS * 2];
    
  • Flathub build

    Flathub build

    Is your feature request related to a problem? Please describe. vkQuake is not packaged for Linux distros, uploading it to Flathub would solve having to download it manually/compile.

    Describe the solution you'd like Make an automated build to flathub.org

    Describe alternatives you've considered Downloading release tar.gz manually

  • Wip keymodifiers

    Wip keymodifiers

    NOTE: I'm not looking to submit this yet -- still WIP

    I'm looking for some early feedback to see if this is something that would get accepted and merged @Novum

  • Add Speedometer

    Add Speedometer

    • Introduced speedometer similar to JoeQuake, useful for speedrunners
    • Updated character draws to allow size specification
    • Added helpful calls -- find best matching color in palette; find hud size for offsetting
  • macOS packaging

    macOS packaging

    Would be nice to have an actual macOS release. It runs well enough through MoltenVK and would make it the only Metal Quake port. Apple probably will remove OpenGL at some point.

    Maybe we should port the QuakeSpasm XCode project?

    Also don't really want to pay for a dev account to sign it. Without that macs refuse to run the app without the right click->open workaround that not everyone knows about.

ORE (OpenGL Rendering Engine) is a rendering engine developed for my college minor project assessment.
ORE (OpenGL Rendering Engine) is a rendering engine developed for my college minor project assessment.

ORE (OPENGL RENDERING ENGINE) What is ORE? ORE(OpenGL Rendering Engine) is a rendering engine with great and easy to use UI that allows the user to lo

Sep 23, 2022
OpenGL®-Starter is a template for your upcoming OpenGL Projects which has been compiled to run the most basic Hello World OpenGL Program from LearnOpenGL.com.
OpenGL®-Starter is a template for your upcoming OpenGL Projects which has been compiled to run the most basic Hello World OpenGL Program from LearnOpenGL.com.

OpenGL®-Starter OpenGL®-Starter is a template for your upcoming OpenGL Projects which has been compiled to run the most basic Hello World OpenGL Progr

Sep 7, 2022
This repository accompanies Ray Tracing Gems II: Next Generation Rendering with DXR, Vulkan, and OptiX
This repository accompanies Ray Tracing Gems II: Next Generation Rendering with DXR, Vulkan, and OptiX

Apress Source Code This repository accompanies Ray Tracing Gems II: Next Generation Rendering with DXR, Vulkan, and OptiX by Adam Marrs, Peter Shirley

Dec 29, 2022
Vulkan Minimal Hybrid Rendering
Vulkan Minimal Hybrid Rendering

Vulkan Minimal Hybrid Rendering A minimal hybrid rendering sample using ray query Features Rasterization Raytraced shadow Environment Vulkan SDK 1.2.1

Aug 31, 2022
Low Level Graphics Library (LLGL) is a thin abstraction layer for the modern graphics APIs OpenGL, Direct3D, Vulkan, and Metal
Low Level Graphics Library (LLGL) is a thin abstraction layer for the modern graphics APIs OpenGL, Direct3D, Vulkan, and Metal

Low Level Graphics Library (LLGL) Documentation NOTE: This repository receives bug fixes only, but no major updates. Pull requests may still be accept

Jan 8, 2023
OBS Linux Vulkan/OpenGL game capture

OBS Linux Vulkan/OpenGL game capture OBS plugin for Vulkan/OpenGL game capture on Linux. Requires OBS with EGL support (currently unreleased, you need

Jan 1, 2023
C++/openGL/Vulkan 3D engine
C++/openGL/Vulkan 3D engine

DeusEx Machina engine C++/GL/Vulkan 3D graphic engine First commit, hello world! :D Reddit post about why I started with skeletal animation system and

May 19, 2022
Legion Low Level Rendering Interface provides a graphics API agnostic rendering interface with minimal CPU overhead and low level access to verbose GPU operations.
Legion Low Level Rendering Interface provides a graphics API agnostic rendering interface with minimal CPU overhead and low level access to verbose GPU operations.

Legion-LLRI Legion-LLRI, or “Legion Low Level Rendering Interface” is a rendering API that aims to provide a graphics API agnostic approach to graphic

Dec 6, 2022
Vire is a C++ voxel rendering engine. It is written in C++14 and uses OpenGL for graphics.

Vire Vire is a C++ voxel rendering engine. It is written in C++14 and uses OpenGL for graphics. Downloads If you'd just like to just download and try,

Dec 22, 2022
A legacy OpenGL simulator for OpenGL 4.4, written in C++.

the-ancient-tri A legacy OpenGL simulator for OpenGL 4.4, written in C++. Why? My Uni forces us to use legacy OpenGL (eww!), and I didn't want to lear

Feb 10, 2022
Quake GPL Source Release

This is the complete source code for winquake, glquake, quakeworld, and glquakeworld. The projects have been tested with visual C++ 6.0, but masm is

Dec 31, 2022
Quake 2 GPL Source Release

This is the complete source code for Quake 2, version 3.19, buildable with visual C++ 6.0. The linux version should be buildable, but we haven't test

Jan 2, 2023
Minimal pathtracer using Vulkan RayTracing
Minimal pathtracer using Vulkan RayTracing

Single File Vulkan Pathtracing Minimal pathtracer using Vulkan RayTracing Environment Vulkan SDK 1.2.162.0 GPU / Driver that support Vulkan Ray Tracin

Dec 21, 2022
A toy renderer written in C using Vulkan to perform real-time ray tracing research.

This is a toy renderer written in C using Vulkan. It is intentionally minimalist. It has been developed and used for the papers "BRDF Importance Sampl

Dec 19, 2022
simple fdtd using vulkan, omp or single thread
simple fdtd using vulkan, omp or single thread

fdtd simple fdtd using vulkan, omp or single thread example how to build first clone the repo with: git clone https://github.com/nikisalli/fdtd.git up

Nov 12, 2022
Implementation of Peter Shirley's Ray Tracing In One Weekend book using Vulkan and NVIDIA's RTX extension.
Implementation of Peter Shirley's Ray Tracing In One Weekend book using Vulkan and NVIDIA's RTX extension.

Ray Tracing In Vulkan My implementation of Peter Shirley's Ray Tracing in One Weekend books using Vulkan and NVIDIA's RTX extension (formerly VK_NV_ra

Dec 31, 2022
A rendering sample that demonstrates bindless deferred texturing using D3D12

Bindless Deferred Texturing and Decals Sample This project is a D3D12 rendering sample that implements a deferred renderer using bindless deferred tex

Dec 31, 2022
基于 Vulkan 实现的 GPUImage

Vulkan-GPUImage 基于 Vulkan 渲染的 GPUImage 版本,实现渲染链机制,复刻 GPUImage 上的多个效果(逐渐增加中)。 更多技术实现,详见源码~~ Vulkan 学习文章 进击的 Vulkan 移动开发(一)之今生前世 进击的 Vulkan 移动开发之 Instan

Nov 15, 2022
Vulkan physically based raytracer including denoising
Vulkan physically based raytracer including denoising

VulkanPBRT Vulkan physically based raytracer including denoising. The GPU raytracer is based on Vulkan only, as well as for the denoising only the Vul

Nov 25, 2022