Re: Architecting and programming a graphics engine in C++ & OpenGL

Tommy Brett <[email protected]> Fri, 18 Mar 2011 10:46:26 -0400
Newsgroups gmane.games.devel.sweng
Message-ID <[email protected]>
There were a few emails between me beginning to write my reply and finishing
it.

Peter - I actually recall a thread on this mailing list last year which
described a programming paradigm that shifted away from OOP toward a more
data driven approach and it piqued my interest considerably. I believe it
separated data and code in an attempt to allow transformation functions to
work on streams of data, I can't find it in my inbox at the moment though.
What you said is basically what I aim to do - create a proof of concept that
a little more advanced than taking an existing 3rd party tool and creating
something with it. Thanks also to Oladotun for giving me some links to read.

- Tommy

On Fri, Mar 18, 2011 at 10:40 AM, Tommy Brett <[email protected]> wrote:

> Thanks for the replies guys, I should clarify that yes a graphics
> programmer is what I would like to become, and if I turn out to be Pretty
> Good at it, then authoring my own game engine would be an exceptional
> challenge to overcome. How I'm going to get to that end goal, or even if the
> end goal is feasible is what I'm trying to ascertain. I understand your
> point Nicholas; the graphics engine I'd like to create might not even be
> rightfully called a 'graphics engine', but I need it to be something that
> would prove to an employer that I'm capable of doing more than stitching
> together some rendering algorithms I pulled out of a couple of GDC papers,
> and in doing so, would get me into a position where I'm able to learn from
> the pros.
>
> I've noticed that a lot of computer games degrees (of which I'm a graduate,
> albeit 5 years ago) include courses specifically designed to build you a
> portfolio, but almost all of them will involve a 3rd party tool to create
> the work. For example, "get 5 people together and create a 1 level prototype
> using Ogre, Unity or Torque". When I did my 'portfolio course' we actually
> built our own engine from scratch (of which I built the physics, AI and
> 'game' part of) and our Professor echoed the same sentiments as those in
> this email thread. But in that case we actually overcame the odds and
> produced a pretty good piece of work that I was able to extend through
> several other courses to include networking and more advanced modular AI...
> But again, the code was not something I'd be overly proud of now, when
> attempting to apply for a position that doesn't have the word 'junior' in
> it.
>
> From this email discussion I'm hoping to be able to get a clear picture of
> what I can do in the time that I have to create a piece of work I can show
> to an employer and say "I built this, the code is solid although simple in
> places, there's room for expansion but this proves without a doubt that I am
> not only capable of working with modern graphics engines, but I also know
> enough of the underlying low level concepts to have designed this". Which I
> think would give me an advantage over other graduates, and give me leverage
> for a paycheck that would justify leaving my current position.
>
> - Tommy
>
> On Fri, Mar 18, 2011 at 10:15 AM, Nicholas Aelick <[email protected]>wrote:
>
>> I would tend to agree with Megan. Building a graphics engine from scratch
>> for the learning experience is a little like building a computer by
>> soldering bits of wire together for the learning experience. You're unlikely
>> to get far, and even if you succeed, you're unlikely to end up with
>> something nicer then is already available.
>>
>> I would recommend looking into existing solutions (partially because any
>> place you work for will have you working with those, anyways). If you're
>> really serious about building a custom graphics engine, find one that's open
>> source, and see how they solved the problems you've been having.
>>
>> Nicholas
>>
>>
>> On Fri, Mar 18, 2011 at 10:03 AM, Megan Fox <[email protected]> wrote:
>>
>>> To take it in another way, I would generally recommend no one set out to
>>> write their own graphics engine from scratch without first using another.
>>> Simple example - OGRE.  Great jumping-off point, great community, etc.
>>> Build up a game around it, then burrow down and start changing OGRE to suit
>>> your needs, then burrow down further and tweak the graphics, and so on.
>>>
>>> There's very little reason to write a graphics engine yourself, unless
>>> you're addressing the faults of a pre-existing engine you tried and found
>>> insufficient.  Without that grounding, you're stumbling in the dark, and it
>>> will likely take quite some time and a hundred dead ends for you to get
>>> within spitting distance of even the bad current graphics engines.  You're
>>> also needlessly re-inventing the wheel, unless Graphics Programming is
>>> specifically what you're aiming at - there's a lot more to games programming
>>> than rendering, and your portfolio would need to be more than rendered
>>> planets to break in (ie. what happens on or with those planets, and why
>>> they're fun to walk around / fly around / whatever).
>>>
>>> ----
>>> Megan Fox
>>> http://www.shalinor.com/
>>> http://www.glassbottomgames.com/
>>>
>>>
>>>
>>> On Fri, Mar 18, 2011 at 7:58 AM, Rémi Papillié <[email protected]>wrote:
>>>
>>>> Hi Tommy,
>>>>
>>>> While this might not answer completely such a broad question, I would
>>>> recommend you look at this site:
>>>> http://gamearchitect.net/
>>>>
>>>> More specifically, some articles called 'An Anatomy of Despair'
>>>> explain the design of the author's engine. See for instance:
>>>>
>>>> http://gamearchitect.net/2008/04/19/an-anatomy-of-despair-orthogonal-views
>>>>
>>>> I would also recommend the excellent book 'Game Engine Architecture',
>>>> by Jason Gregory.
>>>>
>>>> Note, however, that these resources are mainly oriented towards game
>>>> engines as whole. AFAIK, there are not many resources on the specifics
>>>> of graphics engine design and architecture but, as you said, mainly a
>>>> lot of very technical articles one some technologies and
>>>> implementations.
>>>>
>>>> For what it's worth, here is the structure I currently use on my
>>>> personal engine. It works, but has not been confronted to a real prod,
>>>> so what follows is definitely not bullet-proof.
>>>>
>>>> The technical API (OpenGL/DirectX) is abstracted away in a thin layer.
>>>> I use this layer mainly for readibility purposes (e.g being able to
>>>> write texture->enableFiltering(BILINEAR) instead of two or three
>>>> cryptic OGL/DX calls), but with a bit more work, you can also use it
>>>> to make the engine cross-api (with many simple but error-prone
>>>> details, such as matrix transpositions).
>>>>
>>>> On top of that, two modules are present:
>>>> - The graphics scene contains an abstract description of graphical
>>>> elements that are part of the world. No shading algorithms here, just
>>>> plain buffers augmented with various information (transforms...). The
>>>> scene handles all issues about traversal and culling. Whenever a
>>>> render is asked, a render list is built by querying the spatial
>>>> partitioning structure, and then sent to the renderer (see below).
>>>> - The renderer is just the raw implementation of shading algorithms.
>>>> It receives a render list + a frustum and draws everything, using
>>>> various techniques (e.g forward or deferred shading).
>>>>
>>>> The render list basically contains packets in the form <transform,
>>>> mesh, material> (+ lights), but this is highly dependent on how the
>>>> rest is implemented.
>>>>
>>>> Hope this helps! I'll also be very happy to learn about other ways of
>>>> designing graphics engines, if someone else has good resources on the
>>>> subject ;)
>>>>
>>>> Rémi
>>>>
>>>> 2011/3/18 Tommy Brett <[email protected]>:
>>>> > Hi folks,
>>>> > I've been working as an AS3 programmer / animator for the last 3.5
>>>> years,
>>>> > and have the strongest desire to leave the marketing industry behind
>>>> and
>>>> > pursue my original intended career as a games programmer, which I
>>>> sidelined
>>>> > due to a very coincidental series of events. To this end, I've been
>>>> (slowly)
>>>> > building a graphics engine using C++, OpenGL and nVidia CG which
>>>> renders
>>>> > very large chunks of terrain using GPU Clipmaps. The idea is that
>>>> eventually
>>>> > 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. Because I've been outside of my
>>>> programming
>>>> > comfort zone for so long it's been slow going, but now that I've
>>>> finally got
>>>> > a firm grasp on shaders and the OpenGL pipeline it's time to look to
>>>> the
>>>> > future.
>>>> > This is where my problem lies; although there are many examples on the
>>>> 'net
>>>> > showing me how to animate the most beautiful normal mapped cobbled
>>>> cube, or
>>>> > tutorials on specific rendering / culling / lighting algorithms, I've
>>>> yet to
>>>> > find a resource beside Michael Abrash's Graphics Programming Black
>>>> Book
>>>> > (which sits on my desk, reminding me of what I should have been doing
>>>> all
>>>> > along) which goes into the subject of writing a graphics engine. See
>>>> > although I can write perfectly passable C++, and thanks to my AS3
>>>> > programming experience which has frequently required that I get my
>>>> projects
>>>> > right 'the first time', I'm fairly adept at planning and designing my
>>>> > classes before I begin... But from a C++ standpoint, I'm somewhat in
>>>> the
>>>> > dark. What are the best practices for building a graphics engine in
>>>> C++?
>>>> > Exactly how OOP should I go? How should I handle the use of multiple
>>>> shaders
>>>> > on chunks of geometry? There's just this giant multitude of questions,
>>>> and
>>>> > although I have a knack for over engineering things, I really want to
>>>> have a
>>>> > better picture of what I'm aiming for before I start, or I'll end up
>>>> with
>>>> > the monstrosity that is my terrain prototype (it runs, but it's so, so
>>>> > ugly).
>>>> > 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. E.g. one packet
>>>> might be
>>>> > a chunk of terrain, and could include information about what shaders
>>>> to use,
>>>> > how to determine its potential visible set, and the type of collision
>>>> > detection to use (though this deviates a little from the graphics
>>>> engine
>>>> > part). There might be an arbitrary number of terrain packets, followed
>>>> by
>>>> > some character models or buildings using a different type of culling
>>>> > algorithm. My worry aside from the obvious problem of the whole idea
>>>> > possibly being crap, is that it's too general. How could I possibly
>>>> create
>>>> > an engine that handles every possible rendering type, shouldn't I
>>>> perhaps
>>>> > start with the assertion that I'm building a terrain engine, and base
>>>> > everything around rendering sphere like chunks of geometry with
>>>> varying
>>>> > levels of detail? But on the same token, I don't just want to end up
>>>> with
>>>> > another terrain engine prototype as seen on youtube(tm).
>>>> > 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, or
>>>> maybe
>>>> > I should just try and get a position as a junior-something-programmer
>>>> and
>>>> > learn by doing (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, I'd like at
>>>> least
>>>> > some leverage). Ideas? Suggestions? Is this even the right place to
>>>> ask such
>>>> > broad questions? I'm all ears.
>>>> > - Tommy
>>>> > _______________________________________________
>>>> > 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
>>>>
>>>
>>> _______________________________________________
>>> 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
>>
>>
>

_______________________________________________
Sweng-Gamedev mailing list
[email protected]
http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com