[HN Gopher] Computer Graphics from Scratch
       ___________________________________________________________________
        
       Computer Graphics from Scratch
        
       Author : AlexeyBrin
       Score  : 316 points
       Date   : 2021-02-03 18:21 UTC (4 hours ago)
        
 (HTM) web link (gabrielgambetta.com)
 (TXT) w3m dump (gabrielgambetta.com)
        
       | Geminidog wrote:
       | Weirdly, programming this stuff not from scratch can be harder if
       | you use the apis that will utilize the GPU like vulkan or modern
       | opengl.
        
         | psyc wrote:
         | I understand that Vulcan adds a lot of complexity, but OpenGL
         | and Direct3D are surprisingly finite. Once you learn the
         | graphics pipeline, it's not too hard to begin drawing things.
         | Init window and device, fill vertex and index buffers, load
         | textures, load vertex and pixel shaders, set each of these
         | things as the active thing, draw. Of course you can also
         | explore the extents of all these entities until the sun engulfs
         | earth. Even though I've been at it for 30 years, I realized
         | long ago I would never keep up with, learn, and implement every
         | notable technique even if I did nothing else for the rest of my
         | life. But drawing nice looking, animated 3D things is very
         | tractable.
        
         | ratww wrote:
         | This is true, but DirectX 11, Metal and modern OpenGL (without
         | cutting edge extensions) are still very accessible to novices,
         | not to mention that you can transfer knowledge between the
         | three of them, so there's little cost in learning a
         | second/third API.
         | 
         | Vulkan and DX12 however are the work of the devil.
        
           | moonchild wrote:
           | Vulkan is soulless, like uefi: all functions have more-or-
           | less the same interface. But I wouldn't say it's the work of
           | the devil. Its greatest sin is boilerplate.
        
         | bob1029 wrote:
         | I had the same perspective on this. I spent some time building
         | up a 2d graphics library from zero, primarily for drawing very
         | simple UIs on resource-constrained devices.
         | 
         | I initially tried using D3D/Win32 APIs to perform the high-
         | level drawing operations for me, but found that for the scope
         | of functionality that I required, these interfaces were far too
         | heavy-handed. These also have lots of platform-specific
         | requirements and mountains of arcane frustrations to fight off.
         | 
         | I didn't need to interface with some complex geometry or shader
         | pipeline in hardware. Raytracing is hilariously out of scope. I
         | really just needed a dead simple way to draw basic primitives
         | to a 2d array of RGB bytes and then get that to the display
         | device as quickly as possible. What I ended up with is
         | something that isnt capable of very much, but can run on any
         | platform and without a dedicated GPU. I also feel like this was
         | a much better learning experience than if I had slammed my head
         | into the D3D/opengl/et. al. wall.
        
           | whatshisface wrote:
           | OpenGL is really not that much of a wall. I recommend giving
           | it a try.
        
       | Lichtso wrote:
       | Rendering (forward or backward) of algebraic curves (like bezier
       | and nurbs) never gets mentioned in any such collections, despite
       | being essential to any 2D or GUI framework. And if they are, then
       | only as a short: Just subdivide / tessellate it and then put it
       | through the polygon pipeline! However there are far better ways
       | to handle them, which even people in CG seem to be oblivious of.
       | 
       | And of course not to forget all the other approaches to modeling
       | geometry like implicit surfaces, meta-balls, signed distance
       | fields, constructive solid geometry, point clouds, splats,
       | voxels, etc ...
        
       | jtanderson wrote:
       | This looks really great!
       | 
       | I'd also highly recommend Ray Tracing in One Weekend[1], which
       | starts you out with literally just a c++ program to dump bytes
       | into a file which can be opened with most standard image/document
       | viewers. Then you don't have to think about or set up any shaders
       | before you can start to experiment with the rendering algorithms.
       | 
       | [1]
       | https://raytracing.github.io/books/RayTracingInOneWeekend.ht...
       | 
       | Edit: formatting.
        
       | huskyr wrote:
       | Excellent resource! I really like the fact that everything is
       | centred around the idea of just a single 'PutPixel' function.
       | Makes things much more approachable.
       | 
       | I've took the liberty of rewriting the 'Perspective projection'
       | demo (1) in more up-to-date Javascript, using ES6 classes and all
       | the other niceties that modern browsers have. I also used the
       | regular canvas line drawing methods to focus on just the vertex-
       | to-line conversion, and updated the code so that it will work on
       | any resolution. https://codepen.io/hay/pen/gOLazpm
       | 
       | 1: https://gabrielgambetta.com/computer-graphics-from-
       | scratch/d...
        
       | kayoone wrote:
       | CG fundamentals was my favourite course in college. Going from
       | drawing lines with the Bresenham algorithm to drawing polygons,
       | filling polygons with Scanline, implementing ZBuffer, texture
       | mapping and so on. Was a lot of fun even though I never ended up
       | working with CG except for some hobby projects.
        
         | arduinomancer wrote:
         | Agreed, its one of those areas of software that just feels like
         | magic when you code it from scratch and end up with a 3D object
         | on your screen.
        
       | genpfault wrote:
       | Half-space rasterization[1] is a neat alternative to the classic
       | scan-line renderer.
       | 
       | [1]:
       | https://web.archive.org/web/20120212184251/http://devmaster....
        
         | news_to_me wrote:
         | Yeah I find this method way easier to understand than scan
         | conversion. Fabian Giesen has a great series of articles from
         | 2011 that explains it well[0].
         | 
         | Also the original 1988 paper by Pineda is a surprisingly easy
         | read, and it's only 4 pages![1]
         | 
         | [0]: https://fgiesen.wordpress.com/2011/07/06/a-trip-through-
         | the-...
         | 
         | [1]:
         | https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.15...
        
       | bstahlhood wrote:
       | Instant buy. This is so awesome. I was just looking into this
       | subject, so this comes at a perfect time for me. Thank you for
       | the coupon :)
       | 
       | I got a good chuckle out of your technical reviewer: "Alejandro
       | currently works in the GPU Software group at a leading consumer
       | electronics com- pany based in Cupertino, California." I wonder
       | where he works? ;)
        
         | ggambetta wrote:
         | I can't confirm nor deny what you're implying.
        
       | seism wrote:
       | You had me at "rendering a Swiss landscape" 8-) Seriously, this
       | looks like very good material for my own learning or to bootstrap
       | a graphathon.
        
       | Animats wrote:
       | Nice.
       | 
       | There are several ways to approach this subject. This is a
       | bottom-up approach - how do we get pixels on screen?
       | 
       | Other approaches start from "how do we represent a scene", in the
       | sense of a scene graph or at least lists of vertices, triangle
       | indices, and textures. That cuts the problem into "represent
       | scene" and "render scene". That's a practical division, because
       | that's the interface between what you put into a renderer and
       | what the renderer does with it. Today, you're either using
       | someone else's rendering system, or you're building the rendering
       | system. Probably not both, except as an exercise.
       | 
       | This division is actually a bit above the OpenGL/Vulkan level.
       | Vulkan is complicated because it's mostly about setting up the
       | GPU to run a rendering pipeline, talk to displays, and other
       | housekeeping. And memory management. If you have a library to
       | manage that part, it's not so bad.
       | 
       | It's like old computer books, where you started out learning what
       | the arithmetic/logic unit (the ALU) did, how it interacted with
       | memory, what the instruction decoder did, and so on. This
       | prepared you for assembly language programming. Few courses start
       | out there today.
       | 
       | Incidentally, the caption for figure 12-1 is missing some
       | symbols. It reads "Using instead of doesn't produce the results
       | we expect."
        
       | dang wrote:
       | This had a sizeable thread two months ago:
       | https://news.ycombinator.com/item?id=25266812
       | 
       | Also 2019: https://news.ycombinator.com/item?id=19584921
       | 
       | and a bit here: https://news.ycombinator.com/item?id=19096322
        
         | ggambetta wrote:
         | The 2019 thread is what led No Starch Press to contact me in
         | the first place, so I'm very grateful to the HN community :)
         | Keep up the incredible work, dang!
        
       | ggambetta wrote:
       | A long time ago, due to an improbable sequence of events, I found
       | myself teaching Computer Graphics at my alma mater, a year after
       | I took the class myself. Over the following five years or so, my
       | approach to the subject evolved, and I really got the hang of it.
       | After I stopped teaching, I took my notes, handouts and slides,
       | and made them into a series of articles that I put on my website,
       | where they remained in relative obscurity. Hacker News managed to
       | find it every once in a while, and it was generally well
       | received, but nothing came out of this. Until April 2019. It made
       | the HN front page again [0], except this time it caught the
       | attention of an editor in No Starch Press [1].
       | 
       | Long story short, today I'm incredibly grateful and excited to
       | tell you that CGFS is coming out as a real book, with pages and
       | all [2]. The folks at NSP graciously agreed to let me publish the
       | updated contents, the product of almost two years of hard editing
       | and proofreading work, for free on my website [3]. But if you'd
       | like to preorder the printed or ebook version, you can use the
       | coupon code MAKE3DMAGIC to get a 35% discount at
       | https://nostarch.com/computer-graphics-scratch.
       | 
       | I'm still somewhat in disbelief that my work is getting published
       | as a book, and this genuinely wouldn't have happened without your
       | support. So once again, THANK YOU :)
       | 
       | [0] https://news.ycombinator.com/item?id=19584921
       | 
       | [1] http://nostarch.com
       | 
       | [2] https://nostarch.com/computer-graphics-scratch
       | 
       | [3] http://gabrielgambetta.com/computer-graphics-from-scratch
        
         | kayoone wrote:
         | > due to an improbable sequence of events
         | 
         | is that why you ended up working for improbable? ;)
        
           | ggambetta wrote:
           | That was a semi-intentional pun, good catch ;)
           | 
           | You're not far off the mark, though! It was my other series
           | of articles about client-side prediction [0] that brought me
           | to Improbable's attention :)
           | 
           | [0] https://gabrielgambetta.com/client-server-game-
           | architecture....
        
         | trilinearnz wrote:
         | Congratulations! It's a wonderful resource, and great to see it
         | make it's way into library-form.
        
         | mstade wrote:
         | Hey Gabe - great work and huge congrats!
         | 
         | I'm sure you don't remember me, but we used to work together at
         | Improbable - you sent me such a wonderful email when I left to
         | go back to Sweden, thank you!
         | 
         | Anyway, just wanted to say congrats and hope you're doing great
         | buddy. All the best! :o)
        
           | ggambetta wrote:
           | Of course I remember you! Could never forget such an
           | impeccably dressed coworker :) I think we were super close to
           | meeting in Miami that one time I had a long layover?
        
             | mstade wrote:
             | Aww - thank you! <3
             | 
             | That's right, I was in Florida visiting family. Would love
             | to reconnect, don't hesitate to ping me an email at
             | marcus@madebystade.com if the feeling is mutual! :o)
        
         | sriram_sun wrote:
         | Awesome! Thanks for sharing!
        
         | gauku wrote:
         | This looks great. I have been developing interest in CG
         | recently and this looks like a great way to start. Thank you.
         | 
         | And finding your Imdb profile was a nice addition on top ;)
         | 
         | All the best.
        
           | ggambetta wrote:
           | Thanks! For better or worse, I'm interested in a lot of
           | different things
        
         | adamnemecek wrote:
         | How has your approach changed?
        
         | breck wrote:
         | I'm always in the market for great graphics books, and NSP is
         | my _favorite_ publisher, so excited to get this. Thanks for the
         | coupon!
        
           | ggambetta wrote:
           | You're welcome! I have to say they're also amazing to work
           | with :) Special thanks to Alex and Kassie <3
        
         | enriquto wrote:
         | I love this resource, thank you!
         | 
         | My favorite chapters are those about drawing raster lines and
         | triangles. One of my first programs was writing (in 386 16-bit
         | asm) the routine to draw a triangle, and I love these
         | algorithms dearly.
         | 
         | An important and beautiful thing that is missing in the book is
         | the drawing of anti-aliased lines (easy) and triangles (not
         | trivial!). I find that rendering carefully shaded smooth
         | objects with a pixelized boundary loses a big part of the
         | magic.
        
           | ggambetta wrote:
           | Yep, good point. The reason is that the objective of the book
           | is to cover as much material as possible, in the shortest
           | time possible, and in the simplest way possible; so I had to
           | build the shortest path between putPixel() and filtered
           | textures, and that leaves things like antialiasing behind.
           | 
           | I explain a bit of this in the introduction, most of the time
           | I present not the best/fastest algorithm, but the one that
           | it's the simplest to understand. For example, I don't even
           | mention Bresenham's algorithm; instead I present a super
           | simple but inefficient one, which achieves two critical
           | things: (1) you're drawing lines in no time, (2) it motivates
           | the linear interpolation method that is then used for
           | shading, z-buffering and texturing.
        
         | aperrien wrote:
         | This is awesome, but as a kid back in the Pong era, I always
         | wondered how the basic squares of pixels worked. In your
         | travels writing this book, did you ever come across one that
         | explained that in a way friendly to 12 year olds?
        
           | foobarian wrote:
           | I was dismayed to learn that pixels are not square at all. It
           | got worse with the switch to LCD.
        
           | corysama wrote:
           | Can you be specific of the context you are interested in?
           | 
           | On modern machines, a pixel is just a set of three numbers
           | indicating how much red, blue and green light should be shown
           | at a particular point. Ex: {0.75 red, 0.0 blue, 0.5 green}
           | for a kinda-dark, orange pixel. The GPU keeps a big 2D grid
           | of these number-triples in memory and on a regular schedule
           | sends out a copy over the DVI cable to your monitor. The
           | monitor has a bit of memory to hold it's copy. And, it has
           | hardware to scan over the grid of numbers to produce a
           | sequence of voltage levels that are used to change the color
           | of the points on the LCD.
           | 
           | There's a bit of math involved in how to do a good job
           | representing colors with numbers and how to convert those
           | numbers to voltages. But, at the most basic level, an image
           | is just a big 2D grid of numbers. If you want to change the
           | image, poke the grid. People want to change images a whole
           | lot. So, we've developed pretty sophisticated hardware and
           | software around poking 2D grid... But, that's a whole other
           | topic.
        
           | kevin_thibedeau wrote:
           | Pong uses discrete logic gates and no microprocessor for its
           | game logic and graphics. It isn't comparable to much else.
        
           | ggambetta wrote:
           | To some extent, I guess that's what I've tried to do here.
           | The linear algebra _might_ be too advanced for a 12 year old
           | (I didn 't pick it up until much later!), but on the other
           | hand you don't _need_ to follow all the derivations - a 12
           | year old can learn a lot just by following the results and
           | the resulting algorithms.
           | 
           | There's also a linear algebra appendix [0] that presents the
           | operations, explains how to use them, and how they can be
           | interpreted, without going in any theoretical depth about
           | _why_ these things are the way they are.
           | 
           | [0] https://gabrielgambetta.com/computer-graphics-from-
           | scratch/A...
        
           | gamacodre wrote:
           | I was a 12 year old when I learned about them :)
           | 
           | The idea of a pixel is that it's the smallest area of the
           | screen that can be independently controlled, thus the
           | designation "pixel" for "picture element".
           | 
           | In most modern phone screens or monitors, each pixel is
           | formed by a group of three smaller elements with fixed colors
           | (usually red, green, and blue) but _variable brightness_. By
           | controlling the brightness of these sub-elements, we can
           | control what the overall color of the pixel appears to be -
           | once you get more than an inch or two away from the screen,
           | the light from the element group blends into what we see as a
           | single color - so 100% green + 100% red + 0% blue looks like
           | bright yellow. 50% each for red, green, and blue looks like a
           | middling grey. You can usually see the structure of the pixel
           | with a magnifying glass, though this is easier with an old TV
           | or monitor than a modern phone.
           | 
           | These pixels are laid out on a regular rectangular grid, and
           | your display controller will offer some way to set the color
           | of each pixel and to then update them all at some (usually)
           | regular interval, for example 60 times per second. In
           | computers, it's common to keep a "frame buffer" around that
           | stores separate values for the red, green, and blue
           | components of every pixel on the screen. If these are 8-bit
           | values, that implies that each R/G/B component can have 256
           | different levels of brightness, and in combination they allow
           | each pixel to take on one of about 16,000,000 possible
           | colors. So, a program can change pixel colors by writing
           | different values into this buffer and waiting for the updated
           | buffer to be processed by the display controller to change
           | what the display is showing.
           | 
           | Of course, the electronics, physics, chemistry, timing, and
           | logic of display generation have changed quite a bit since
           | Pong. And not all displays even have pixels - vector displays
           | used to be a thing, and are still used in some very
           | specialized applications.
        
             | aperrien wrote:
             | I appreciate the explanation, but it's not for me. I'm
             | trying to find a good book to recommend to my grandkids.
             | I've had fun teaching them how to use old retro computers
             | (c64, Apple II, and such). It's been a fun experience, but
             | I'd like to give them some references that aren't me! I've
             | personally come a long way in my computing skills since I
             | was staring at shiny new Pong screens :)
        
               | gamacodre wrote:
               | That's trickier - somewhere along the way I stopped
               | buying books and just do tactical forays onto the net
               | when I need a new bit of domain knowledge.
               | 
               | Details like how and why pixels work are much easier to
               | understand and retain if they're in some kind of context.
               | Gamers learn about pixels to better understand the games
               | or their gear. Devs learn about them in order to control
               | them. Artists learn about them to better understand why
               | computers mangle their art. So maybe choose an area the
               | grandkids are engaged with and look for something there
               | that also touches on display tech.
        
               | TimBurr wrote:
               | Thinking of when I was 12 (2005?), microscopes and
               | magnifying glasses helped me understand. Depends on
               | device DPI (cell phones have an insane number of pixels
               | per inch; desktop screens are usually less dense).
               | 
               | If you can zoom in enough to see subpixel elements, and
               | pull up a color wheel, it's very intuitive to see that
               | the screen is made of pixels, and the pixels are made of
               | three elements.
               | 
               | https://en.wikipedia.org/wiki/RGB_color_model#/media/File
               | :Ad...
               | 
               | The Pico-8 might be a approachable way to explore
               | retrocomputing. It's an in-browser console modelled after
               | GameBoy-era consoles.
               | 
               | https://news.ycombinator.com/item?id=18240375
               | 
               | I don't know about books, though. I remember reading the
               | binary/computers chapter of How Things Work and being
               | thoroughly confused at that age. There was some extended
               | allegory about white mammoths and black mammoths.
        
       | wilsonfiifi wrote:
       | Hey thanks for the book as well as the discount code. Quick
       | question, do you think this will be beneficial to me if say I
       | want to write a server side charting library?
        
       | fouric wrote:
       | One of the things that I really like about this course is that it
       | teaches both raytracing _and_ rasterization. Usually, computer
       | graphics tutorials are either the practical, higher-level,
       | rasterization-focused kind (oftentimes around half  "how do
       | opengl"), or how the business card raytracer works.
       | 
       | Having a single course written by a single person that presents
       | _both_ major rendering techniques is amazing.
        
         | OnlyMortal wrote:
         | Crikey. I had to do a breesnam line drawing and hidden surface
         | removal at _Polytechnic_ back in the late 80s.
        
       | reaperducer wrote:
       | Coincidentally, just last night I was reading an issue of Byte
       | magazine from 1976. It was telling people how to do just this:
       | Computer graphics from scratch.
       | 
       | Except, back then "from scratch" meant soldering together wires
       | and transistors and such.
       | 
       | The big prize was displaying a vector Starship Enterprise on an
       | oscilloscope.
        
       ___________________________________________________________________
       (page generated 2021-02-03 23:00 UTC)