BMOW title
Floppy Emu banner

3D Graphics Thingy

3D Graphics Thingy was a project that spurred lots of interesting research and experimentation, but never led to any concrete results. It was an attempt to create a custom graphics coprocessor, using 1990s-era rendering hardware techniques, and implemented in an FPGA. It was intended to be capable of generating real-time 3D graphics. Matched with an off-the-shelf CPU, it was envisioned as a custom single-board computer, optimized for the task of gaming graphics.

Development began with a Xilinx Spartan-3A FPGA kit. Along the way, I learned a tremendous amount about FPGA development, and explored the effects of limited memory bandwidth on 3D graphics hardware, including potential optimizations for reducing bandwidth requirements. But the project became bogged down in the details of implementing a DDR memory interface, and never actually reached the point of developing the interesting 3D parts. Eventually I dropped it and moved on to new things, although the core concept may return someday as a 2D Graphics Thingy. Lesson learned: start with a small project and add to it incrementally, instead of beginning with grandiose plans.

You can follow the development history of 3DGT on this site to learn more.

8 comments 

8 Comments so far

  1. MooglyGuy June 4th, 2009 8:38 pm

    I read your blog entry about the possible functionality of the 3DGT, and I have to offer a suggestion for the blending unit.

    In general, fixed-function GPUs do not go so far as to compute a “weighted average”, at least not in so many words. The blending units for most fixed-function GPUs boil down to something relatively simple to implement in hardware, consisting of some muxes, an adder, a multiplication unit, and some optional clamping. They implement the following sort of equation:

    (Src * SrcFactor) + (Dest * DestFactor)

    Src is the pixel that was output by the pipeline, Dest is the pixel that currently resides in the framebuffer. SrcFactor and DestFactor are typically a 4-way mux allowing you to select: 0, 1, Factor, or (1 – Factor).

    Should be fairly straightforward to implement.

  2. Steve June 5th, 2009 6:07 am

    That’s true. I think I mentioned “weighted average” in the context of alpha blending, and was thinking of the case where SrcFactor=Factor and DestFactor=(1-Factor), which produces a weighted average of src and dest. But I suppose you could also choose SrcFactor=Factor and DestFactor=1, to get an additive alpha effect, and other combinations.

  3. James Newman June 10th, 2009 9:10 am

    I saw your post on fpga4fun, and was led here. I seem to be following in your footsteps, or alongside anyway. I just recently played around with making my own CPU out of 7400 or 4000 series logic chips. I got alot on paper, got a wirewrap board similar to yours for your bmow, but stalled on getting ahold of a reserve of ICs. I decided doing it in an fpga would allow me more felxability for future work. Started learning verilog a couple weeks ago. I’ve so far got a simple cpu going, and vga output. Currently I’m working on getting my ddr2 ram working. I’ve decided I want to write the memory controller from scratch, so mainly been studying timing diagrams for the last two weekends. I got the spartan 3a starter for the 12 bit color and the increased fpga space.

    Anyway, one of my projects aside from my own cpu is also a gpu. I however am going to start with 2d with a sort of programmable pipeline. So sort of starting on the opposite end as you, in that I want my gpu pipeline to be programmable from the start.

    Will be keeping an eye on your projects for here on out. Good work so far, and good luck! 🙂

  4. John July 22nd, 2009 9:37 pm

    Nice work (and nice site). Check out http://www.johnculp.net/tvc.html for my similar 3D graphics project.

  5. Steve July 22nd, 2009 10:26 pm

    Wow, very very nice! I’ll be contacting you for more details…

  6. ov3rcl0ck August 8th, 2009 12:38 pm

    Wow, nice work! You keep rolling out mind blowing projects. If you could provide some documentation I could program a small Linux driver for it(in time).

  7. Jason September 14th, 2009 8:21 am

    Great work, some very interesting projects you have on this site.

  8. NrDesign November 9th, 2009 7:05 pm

    Best luck on this!

Leave a reply. Comments may take a few minutes to appear.