I recently came across this Q/A and about a year ago or so when I started traveling down this path; I would have found this to be a very good resource and reference page in regards to related questions of my own.
Part 1:
-Preface-
A little bit about myself:
In the mid to late 80's when I was still in Elementary School, I would take apart junk stereos, VCR, and other electron devices that were from the 50's through the 80's and would look at the circuit boards and always wanted to know how did they work... How did they actually acquire the broadcast signal, produce audio, video, do this and that etc... I could recognize the individual parts here and there such as a resister, capacitor, diode and transistor, but didn't know what they did or how they functioned at such a young age.
Throughout the years I've always been exceptional in Mathematics, Physics and Chemistry. I understood math to a high degree and could even read some simple or basic circuitry from my middle school and high school days which came later, but I never made it to learning about the logic gates and how they were constructed... I did however learn Boolean Algebra in High School from my Logic, Probability and Statistics Honors class. All of my math and science classes were honors classes. I didn't take Calculus until my second semester at a community college. I tested out of College Algebra and took Trigonometry as a refresher course. My highest level of math from the classroom is Calculus II of a single variable.
I've been playing video games since I was about 3 or 4 years old. As a child I had the Atari, the NES, Sega Genesis and the PS1. As I got older and into my late teens and early 20's I had acquired the PS2 and the SNES with preferred select titles. This also doesn't account for PC gaming that goes as far back as Doom!
I've always been an avid Console and PC gamer and this doesn't include pinball and arcade games.
I was given my first PC when I was about 12 years old for Christmas in the early 90's. The days of DOS 6.0 and either Win 3.11 or OS/2. Since then I've always been familiar with the "Windows" family of operating systems and all of the systems I've had were Intel Architecture. I've had limited experience with Apple or Mac from school or college, but I never had the privilege to work on Linux systems. I do have Cygwin and I've tried my hand at learning bash, but I'm so accustomed to Dos or the Command Prompt syntax.
In the early 90's I would get a copy or two of PC-World and would type in the code snippets into QBasic which I didn't know very well and would try to make those programs work. The only one that was successful was a program to turn key presses on the home row of keys into different ring tone sounds. I don't mean the ring tones on a cell phone I mean a continuous frequency as long as you held the key down.
It's always been a passion of mine to not only want to know how electronic devices worked within the circuity at the digital and logical level, to learn how to program a computer, but I've always had the desire to want to make my own video games. Even back in the early 90's I wanted to make the games Frogger and Tetris...
This became my leading motivation and desire to tackle one of the toughest types of programming or software development within the field of Computer Science and that is 3D Game Engine Design. There are other fields in Computer Science that are just as tough, however any sophisticated game engines will typically or usually include almost all of them as the individual components or sub engines require their techniques and or properties.
I had some background in programming from my High School days but this was limited to the horrible Visual Basic. I started to pick up and learn C/C++ around 2002 - 2003 not until a few years after I have graduated from High School in 1999. Even to this day I do not have any college class experience in Computer Science or Computer Engineering, but through dedication and determination, I have learned just about every concept there is when it comes to computers, hardware, programming, algorithms, etc. and I still continue to learn as much as I can...
During the early days of learning C/C++, I did have access to the internet but the internet then was in its early stages, websites like Amazon, Youtube, Facebook etc. didn't even exist yet, it was still the days of 56k dial up modems which tide up your phone line if you didn't have a second dedicated line. It would take minutes just for an image to render onto the screen, never mind continuous video playback.
So when it came to research and learning how to program in C++, resources were limited and most were in text format. When attempting to tackle the projects from the early internet tutorial days, many of those projects were not fully complete, the writers were either professionals or college students and they made many assumptions that the reader was already familiar with many of the needed concepts such as compilation, linking and debugging and library integration.
For someone who doesn't know anything about those topics, they are at a loss because they don't know what went wrong, nor how to fix it, and how to get it to work properly. It took me many hours of trial and error in those days with very limited resources. Asking for help such as we can now with this website or looking for detailed explanations that you can find on cppreference wasn't available! If you personally didn't know anyone, there weren't that many you could turn to for assistance!
As time went on I did improve some of my knowledge here and there, and eventually the internet improved to DSL, and now High Speed internet, websites became more interactive, videos started to show up, quality of videos became better with time, sites such as Youtube started to show up and things became a little easier on the research side. More and more tutorials became readily available, some were good and useful where others taught bad practices...
I had also spent plenty of time finding and acquiring the necessary tools for development. I had to learn the language syntax, the compiler and compiling process, linking, building and debugging. Then I had to learn about the different available libraries and APIs that are out there and how to configure my projects or solutions to link all of those dependencies.
Over the years I have watched the C++ language grow, evolve and adapt over time. In the beginning it stayed nearly the same for many years, but in the last 10 years it has changed dramatically within this short span since its inception.
I mention all of this because C++ is one of the toughest languages to fully master because of its versatility, power, rich feature set and the ability to allow you to shoot yourself in the foot! And even with all of its caveats, it is one of the most powerful and preferred languages that is used in the top leading industry as a standard for this type of development because when it is done correctly it is fast, concise, reliable and uses the smallest foot print.
Since then I've been self taught in C/C++ for many years with the intent and focus on learning 3D Graphics Programming and Game Engine Design. I have put in 100's to 1,000's of hours of searching, research and much more into reading, learning and applying that knowledge into the designing of useful working products and applications. I have always had the will and desire to want to learn more to improve my skill sets and craft.
This was the first stage, then I had started reading and working with initially DirectX 9.c, which I have done in C/C++ and even C#. Then I moved onto DirectX 10 and Legacy OpenGL 1.0. From their came DirectX 11 and OpenGL 3.x - 4.x and now I have even tried my hand at Vulkan.
I have built successful game engines working through various online tutorials both in text and video formats. I already stated that I had a strong background in math but it was limited to Calculus I & II. I had to teach myself Vector Calculus which I had some knowledge of from my Calculus based Physics class in college but as for Linear Algebra with Affine Transformations and Analytical Geometry I had to learn them on my own when certain equations, functions, methods, algorithms and concepts were needed. Then I had to learn how to translate those into efficient, readable, reliable, reusable code that was generic and bug free as possible putting in hundreds to thousands of hours of debugging.
It has been a marvelous journey learning the topics and algorithms that include memory management, reference counting, instancing, recursion and much more that are used within many if not all of the components of a game engine where they are vast. I could list all of them here but that would be enough information to fill 3 or 4 answer space worth of write up. However, I will include the list of the general topics just not their sub topics.
Here are the topics or subject list in what consists of a fully functional game engine which includes all of the various rending techniques, setting up the
rendering and shader pipelines, shading and lighting techniques via shaders, pre and post processing, frame buffers, back buffers, image loading, audio and model loading and parsing, creating primitive shapes with color material properties, texture and normal coordinates with manual texture mapping, object transformations, camera types, scene graph hierarchies, manager classes for textures, audio, fonts, & shaders and memory management, logging system with exception handling, multi-threaded and parallel programming techniques, networking, physics engine, collision detection, particle generator, animation, game AI, terrain generation, sky boxes and sky domes, water rendering, foliage and more..., GUI's with textured font for text rendering, HUD overlays, inventories, map and macro generation, state system and state machines, and finally writing a parser to create your own scripting language to automate much of these objects to have the ability to change data values within the engine without having to recompile just by loading in the data files to populate the data objects and structures within their respective containers at application startup.
Throughout the years on and off I've been intrigued to want to learn assembly language, from their I wanted to learn about compilers, assemblers and simple operating systems, I mean their internal workings, how they are built and designed.
Time went on and then I side stepped a bit and started to get into learning hardware emulation. I focused specifically on the NES but wanted to learn hardware emulation of CPU's in general. This lead me into learning about the instruction set in which I already knew the concept and what it was as I was already familiar with Intel's x86 family to some degree, but now I had to learn the 6502 Instruction Set.
Yet by diving into this, I ended up doing more research and started to learn about the Instruction Set Architecture from an Engineering perspective. This got me into learning about how the CPU is built from the logic gates and how the logic gates are built from transistors along with other various electrical components. So I ended up learning about this from two perspectives top down and bottom up. Both methods were very effective and I think that learning from both helps to build that bridge or gap where the software meats the hardware.
From this, I had to refresh on my Boolean Algebra and I ended up learning about K-Maps, Implication Tables, State Machines both Mealy and Moore and various other things that relate Binary Logic and Arithmetic to the Physical Logical Gates and Integrated Circuits. And this brings me to the resent past where I started to work with Logisim, and started to learn HDL, VHDL, Verilog etc...
I've been learning all of this on my spare time when I could throughout the past 15 - 18 years.
Here are some of the sites and links that have guided me through out the years. Many of these are recent as many of the sites I originally learned from either no longer exist, I have lost their links and don't remember, or search engines pushed them in the far back of their searching lists...
Languages - C++
3D Graphics Tutorials and Resource Websites
Youtube series and channels these cover the topics above as well as hardware, computer and electrical engineering. There are too many to list so I will list a few of them here that I find the most useful and resourceful. I won't provide the links but you can search youtube for these channels.
- 3Blue1Brown - Advanced Mathematics
- Bisqwit - Advanced C/C++ Programming (Application Projects)
- NES Hardware Emulator
- Jason Turner - Advanced Modern C++ programming techniques
- javidx9 - Advanced C/C++ Programming (Application Projects)
- NES Hardware Emulator / Some Assembly
- MIT OpenCourse - College Courses in Mathematics and Computer Science
- Bilkent Online Courses - College Courses in Computer Science and Computer Engineering (CPU Design MIPS)
- The Cherno - Advanced C/C++ Programming Topics and Applications
- Game Engine Development
- Ben Eater - Hardware Engineering - Practical Application via Breadboards
- Neso Academy - Hardware Engineering - Theory and Concepts
- Socratica - Python programming
- Simply Put - Hardware Engineering - Theory and Concepts
- Bitwise - Advanced C/C++ Designing an Assembler via Hardware Emulation
- Bo Qian - C++ Topics in data structures and algorithms.
- LineByLine - Vulkan Programming
- Joshua Shucker - Vulkan Programming
- www.MarekKnows.com - C++, 3D Math and Game Engine Development
And these don't take into account of some of the various books I have on these topics.
-Note- Please do not vote on this as this is only a message to the reader of my own personal experience and is void of any attempts to answer or reference the original question. In the next couple of days when I have the time; I'll add a follow up answer to give my thoughts about the OP's question while providing useful links as a reference and set of resources and I'll update this answer as well to include some links here and to modify this note. It is late and I currently don't have the time to proofread and edit what I have already written. I'll do this when I can".