My dad brought home an Apple ][+ ( 48k of ram! ) christmas 1982. He knew COBOL, and taught himself BASIC, and taught my sister and I when I we were 13 & 12. He made a program with 'for loops' that cleared the screen horizontally. Then I changed it to make it vertical, then diagonal. Then I made a sort of tron-light-cycle game. The next year I met another kid at my school who knew basic. I had started learning assembly, so we hooked up and made some very innovative half-finished games. We even did digital audio recording through the cassette port & playback through the speaker.
We each made flood-fill routines, and also fast 14x14 sprite renderers, and a complete Ultima 3/4 type RPG engine.
I got an austin computers 286 16mhz pc in 1988, and taught myself x86 assembly & EGA/VGA low level rendering. I made a 3d voxel engine in 1992 all in assembly. All assembly was really hurting my productivity but MS Quick C was confusing as hell to me. When a friend taught me Turbo Pascal, I was in heaven, and I shipped my first complete game, Hubie in 1996 using Borland pascal & inline assembly. That same year I saw a 3dfx voodoo prototype, and started to learn more 3d. Soon after, I learned Direct Draw, Direct 3D 1 & 3, then started at nvidia, learning direct3d 5/6 and gpu programming in general. Over the next few years I was in the right place, time & role to innovate in a number of graphics areas, such as per-pixel lighting, attenuation maps, shadows anti-aliasing, etc.
One thing that I did a lot was to lurk in game & graphics programming forums. I've found need a long gestation period to really grok something, so that helps me by seeing something repeatedly over a long time period. Then I can connect new ideas with old things I've read about or done. Another thing I'm learning about myself is that my most innovative periods are tied to meeting and working with new people, so I recommend meeting with like-minded folks.