@Nexus: Thank you for the reply!
I used SFML for creating window, rendering, audio playback and handling input devices.
Regarding the 3D rendering, most of the actual rendering process is done in the software layer. For every frame, a byte array corresponding to the screen size is filled with color values dot by dot via a software renderer written in C#. The byte array is then transferred to the video memory as an OpenGL texture and displayed as a single quad which fills the entire screen. I know that this method is not very efficient, but this method is necessary to exactly reproduce the original software renderer of Doom.
If you are interested in the software renderer of Doom, there is a great material in which the rendering process in Doom is explained. You can access the free PDF from the following link.
The Game Engine Black Book: DOOM by Fabien Sanglard
https://fabiensanglard.net/gebbdoom/index.html