Re: Architecting and programming a graphics engine in C++ & OpenGL
Tommy Brett <[email protected]> Fri, 18 Mar 2011 14:26:18 -0400
| Newsgroups | gmane.games.devel.sweng |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Mar 18, 2011 at 1:30 PM, Massimo Del Zotto <[email protected]>wrote: > 2011/3/18 Tommy Brett <[email protected]> > >> ... pursue my original intended career as a games programmer, ... it will >> render planets with atmosphere and real time shadows, or die trying, and in >> any case will serve as my main portfolio piece when I eventually start >> applying for positions. >> > Hello Tommy, I also started working on my engine for this same reason ("as > portfolio"). I don't know how other people are set but I suppose you will do > more or less what I've been doing up to now so I hope you will find my > advices useful. > > >> What are the best practices for building a graphics engine in C++? Exactly >> how OOP should I go? >> > A stupid answer would be "as far as you need but no more". When I started > working on my system I tried to make pretty much of everything OOP. I > eventually figured out that OOP is not always the best tool for the job. > Some systems are natively data-oriented and some will inevitably need > reinterpret_cast (oh, the horror). You will have to get your hands dirty. In > some cases, having less abstraction can be helpful. In general, my design > rarely relies on objects but is really based on "subsystems" which (as an > implementative detail) emerge from aggregating objects. Rather than objects, > I really think in terms of "protocols" (quite similar to "network > protocols"). You might say this is exactly what objects are made for. Yes > but the whole point is: don't be afraid of steering away from OOP every once > in a while. > The more you go "high level" the more OOP will result useful but at low > level, bad surprises might await you and the systems have to be coupled > somehow anyway. > This is why I mentioned 'how much is too much', because from my own experimentation and from reading previous gamedev mailing list discussions, OOP is clearly not always the best method for graphics engines. > As for how to write good C++ engines I'd suggest to remember that while C++ > has no explicit "interface" classes, they are indeed there and they will > help you a lot (the compiler also seems to like them pretty much IMHO). Many > people seem to forget this so just in case... > Interfaces are definitely something I've gotten comfortable with using in my AS3 programming, it's a neat alternative to deriving from a base class. > > > >> How should I handle the use of multiple shaders on chunks of geometry? >> > You're not going to solve this right now. Use iterative design. You really > have no choice, this would cause you to meltdown your head. I don't quite > figure out what you mean by "multiple shaders on chunks of geometry". Are > you referring to multiple materials? Are you referring to multipass > techniques? > Your first step is surely to figure out what you mean by "shader" because > when you have an engine, "shaders" as most APIs provide will probably lack > something here or there. For example my "engine shaders" provide special > binding points to link engine logic. Say you want to make everything fade to > black progressively as player's health drops to 0. > They also include additional information which are not part of the "API > shader" such as blend mode to use (this is similar to DirectX "effects") and > other additional stuff. > Now, those requirements weren't introduced in a day but evolved out of the > needs. This is why some people advises to "write games not engines"... you > really need to understand what you need for real before you can hope to > understand a way to solve the problem in a reusable, "engine" way. > Both materials and multi pass rendering techniques. I suppose it's a broad question and I think you're right with the 'just code it' approach. What I meant was, given a collection of meshes, each with their own textures and effects, what would be the best way to organize those chunks of geometry data, how would I manage engine state from chunk to chunk? E.g. switching shaders, would switching shaders mid render even be viable? > > > >> Currently my idea for a graphics engine involves something like an engine >> class that takes render packets of data, has some sort of ability to sort >> them into an order that best facilitates speedy rendering, and changes its >> state depending on the information in the packets. >> > This makes me think about > http://realtimecollisiondetection.net/blog/?p=86 > but you probably don't mean this kind of low-level sort... or do you? > According to what you write next, it seems you're thinking at a much higher > level which apparently seems to be scenegraph's responsability. I don't > know. > As a final note here, the link I provided is effective but until you don't > finalize the systems involved it creates a strong dependancy which will slow > you down (where in the hierarchy should I put this batch?). Start easy > first! Leave the order emerge from your design first. Benchmark. Refine. > Repeat. Be aware of premature optimization. When in doubt write easy to > understand code, the bugs will generally emerge some time later, often > because of change in requirements, and you want the code to NOT bite you. > You probably have plenty of perf anyway and your first objective is get the > work done. > > > >> So I suppose what I'm looking for are book suggestions, or perhaps >> open-sourced graphics engines that I could look at and learn from ... the >> trouble is there aren't any such positions available where I live, and >> relocation would be difficult to justify based upon the possibly low salary >> expectations of a junior position >> > It is always a good idea to consider already available engines. You really > have to look around you (at least your state as very minimum) and figure > out what to do as there's a serious social aspect to consider here. > From the few demos I've given out I can say that presenting something which > is 100% yours is fairly impressive, especially for small realities, it seems > that the idea of having somebody which can work out problems top-to-bottom > is very appreciated. Problem is that it takes a lot - a lot - of effort to > get to the first demo. It still takes a lot to go to the second as you will > keep working on it which in fact will result in less demos (or reuse of the > very same one). > Second problem is, as other people have said, turning a pre-made engine > into something yours is indeed valuable skill as well, which is likely much > more important if you're going to apply in consolidated companies. Not my > case here... :-( > > Pre-made engines give you a great kickstart (it's awesome for morale)! On > the cons, I have to admit some projects I've looked at seemed to be halting > after a while. Let's not hide the fact: once you choose an engine you choose > a line of thinking and this implies you will think your design in a certain > way. Which is easier. The day you get a problem which is not directly > solvable by the engine, you start having issues. > I say this because a friend of mine had exactly this problem. Its > initial enthusiasm of having "parallax mapping and shadows everywhere" > quickly faded when he figured out the hard truth: the engine prevented him > from understanding the problems involved. > Of course, if you take your time to make sure you know what you're doing, > this should not be a problem and you'll get best of both worlds. I just > wanted to drop this warning. > Your reply and other people's has given me a perspective that I didn't consider before - taking someone elses engine and modifying it to suit my own needs would certainly be an exemplary show of skill, especially for studios that use 3rd party tools themselves > > Experimenting a bit with modding games such as Unreal or Quake is very > useful IMHO. If you haven't tried making a Quake map then you should really > try right now. Take a look at the formats. Do some black box analysis. Take > your time... if you can afford it. > Also try to figure out what assets you have access to and make sure you > understand the data encoded in ("know your data"). I've scratched my head > more than a year in making a shader work according to a "reference > implementation" before figuring out that the "reference" asset pipeline is > way smarter than I originally believed, let's say it works around data > format's dumbness... > Actually it's funny you mention Quake mapping, when I started fiddling with games and programming, I started with programming q-basic and making Doom maps, which eventually progressed to Quake and Half-Life (I rather enjoyed Worldcraft, even though it took forever and a day for them to release decent texture mapping tools) and ignited my desire to become a programmer (luckily I was young enough at the time that abusing goto didn't stick with me for long). It's also why I have Michael Abrash's Black Book, I'm fascinated by fps engines and how they calculate potentially visible data from a vast map. > > > I hope this helps, > Massimo > Greatly so, thank you. > > _______________________________________________ > Sweng-Gamedev mailing list > [email protected] > http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com > > _______________________________________________ Sweng-Gamedev mailing list [email protected] http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com