Home

Awesome

<p align="center"><img src="vkQuake2.png"></p>

Build status

Linux MacOS Windows

Overview

This is the official Quake 2 code v3.21 with Vulkan support and mission packs included. The goal of this project is to maintain as much compatibility as possible with the original game - just pure, vanilla Quake 2 experience as we knew it back in 1997. There are, however, a few notable differences that made the cut for various reasons:

A more detailed description of the thought process behind this project can be found in my blog post, where I explain the overall design, how I attacked some of the problems and also how things developed after the initial release.

Building

For extra challenge I decided to base vkQuake2 on the original id Software code. Because of this, there are no dependencies on external SDL-like libraries and the entire project is mostly self-contained. This also implies that some of the original bugs could be present.

Windows

Linux

Unfortunately, Linux code for Quake 2 has not aged well and for that reason only the Vulkan renderer is available for use at this time. Build steps assume that Ubuntu is the target distribution:

sudo apt install make gcc g++ mesa-common-dev libglu1-mesa-dev libxxf86dga-dev libxxf86vm-dev libasound2-dev libx11-dev libxcb1-dev
export VULKAN_SDK=/home/user/VulkanSDK/1.3.224.1/x86_64
export PATH=$VULKAN_SDK/bin:$PATH
export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
export VK_LAYER_PATH=$VULKAN_SDK/etc/explicit_layer.d
sudo apt install mesa-vulkan-drivers

MacOS

export VULKAN_SDK=/home/user/VulkanSDK/1.3.224.1
export VK_ICD_FILENAMES=$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json
export VK_LAYER_PATH=$VULKAN_SDK/share/vulkan/explicit_layer.d

This project uses the Vulkan loader bundled with the SDK, rather than directly linking against MoltenVK.framework. This is done so that validation layers are available for debugging. Builds have been tested using MacOS 10.14.2.

FreeBSD

pkg install vulkan-tools vulkan-validation-layers

Raspberry Pi 4

Thanks to the effort of Igalia and their V3DV Driver, it is possible to compile and run vkQuake2 on Raspberry Pi 4. Same build instructions as for Linux apply.

Running

Windows

The Visual Studio C++ Redistributable is required to run the application: 32-bit or 64-bit depending on the chosen architecture. These are provided automatically if you have Visual Studio installed.

All platforms

The release package comes only with the Quake 2 Demo content to showcase Vulkan functionality. For full experience, copy retail .pak, model and video files into the baseq2 directory and run the executable. For mission packs, copy necessary data to rogue ("Ground Zero"), xatrix ("The Reckoning"), zaero ("Quake II: Zaero") and smd ("Slight Mechanical Destruction") directories respectively. You can then start the game with either ./quake2 +set game rogue, ./quake2 +set game xatrix, ./quake2 +set game zaero or ./quake2 +set game smd.

Music

This project uses Miniaudio for music playback if the original game CD is not available. For standard Quake 2, copy all tracks into the baseq2/music directory following the trackXX.[ogg,flac,mp3,wav] naming scheme (so track02.ogg, track03.ogg... for OGG files etc.). For "Ground Zero" and "The Reckoning", copy the tracks to rogue/music and xatrix/music directories respectively. For additional control over the playback, use the miniaudio [on,off,play [X],loop [X],stop,pause,resume,info] console command.

Console commands

The following commands are available when using the Vulkan renderer:

CommandAction
vk_validationToggle validation layers:<br>0 - disabled (default in Release)<br> 1 - only errors and warnings<br>2 - full validation (default in Debug)<br>3 - enables VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT
vk_stringsPrint some basic Vulkan/GPU information.
vk_memPrint dynamic vertex/index/uniform/triangle fan buffer memory and descriptor set usage statistics.
vk_deviceSpecify index of the preferred Vulkan device on systems with multiple GPUs:<br>-1 - prefer first DISCRETE_GPU (default)<br>0..n - use device #n (full list of devices is returned by vk_strings command)
vk_msaaToggle MSAA (multisampling):<br>0 - off (default)<br>1 - MSAAx2<br>2 - MSAAx4<br>3 - MSAAx8<br>4 - MSAAx16
vk_sampleshadingToggle sample shading (supersampling) for MSAA. (default: 0)
vk_modeVulkan video mode (default: 11). Setting this to -1 uses a custom screen resolution defined by r_customwidth (default: 1024) and r_customheight (default: 768) console variables.
vk_flashblendToggle the blending of lights onto the environment. (default: 0)
vk_polyblendBlend fullscreen effects: blood, powerups etc. (default: 1)
vk_skymipToggle the usage of mipmap information for the sky graphics. (default: 0)
vk_finishInserts a vkDeviceWaitIdle() call on frame render start (default: 0).<br>Don't use this, it's there just for the sake of having a gl_finish equivalent!
vk_point_particlesToggle between using POINT_LIST and textured triangles for particle rendering. (default: 1)
vk_particle_sizeRendered particle size. (default: 40)
vk_particle_att_aIntensity of the particle A attribute. (default: 0.01)
vk_particle_att_bIntensity of the particle B attribute. (default: 0)
vk_particle_att_cIntensity of the particle C attribute. (default: 0.01)
vk_particle_min_sizeThe minimum size of a rendered particle. (default: 2)
vk_particle_max_sizeThe maximum size of a rendered particle. (default: 40)
vk_lockpvsLock current PVS table. (default: 0)
vk_clearClear the color buffer each frame. (default: 0)
vk_modulateTexture brightness modifier. (default: 1)
vk_shadowsDraw experimental entity shadows. (default: 0)
vk_picmipShrink factor for the textures. (default: 0)
vk_round_downToggle the rounding of texture sizes. (default: 1)
vk_logLog frame validation data to file. (default: 0)
vk_dynamicUse dynamic lighting. (default: 1)
vk_showtrisDisplay mesh triangles. (default: 0)
vk_lightmapDisplay lightmaps. (default: 0)
vk_anisoToggle anisotropic filtering. (default: 1)
vk_vsyncToggle vertical sync. (default: 0)
vk_postprocessToggle additional color/gamma correction. (default: 1)
vk_underwaterToggle player vision warp when underwater. (default: 1)
vk_restartRecreate entire Vulkan subsystem.
vk_mip_nearfilterUse nearest-neighbor filtering for mipmaps. (default: 0)
vk_texturemodeChange current texture filtering mode:<br>VK_NEAREST - nearest-neighbor interpolation, no mipmaps<br>VK_LINEAR - linear interpolation, no mipmaps<br>VK_MIPMAP_NEAREST - nearest-neighbor interpolation with mipmaps<br>VK_MIPMAP_LINEAR - linear interpolation with mipmaps (default)
vk_lmaptexturemodeSame as vk_texturemode but applied to lightmap textures.
vk_fullscreen_exclusiveWindows only: toggle usage of exclusive fullscreen mode (default: 1). Note that when this option is enabled, there is no guarantee that exclusive fullscreen can be acquired on your system.

Acknowledgements

See also

Known Issues