Game Engines 2021W Lecture 18: Difference between revisions
| No edit summary | |||
| Line 31: | Line 31: | ||
| * rendering pipelines | * rendering pipelines | ||
| * parallel processing & 3D | * parallel processing & 3D | ||
| ==Notes== | |||
| <pre> | |||
| Raster vs vector graphics | |||
| Vector graphics | |||
|  - based on CRT technology | |||
| Old video games are in this pure vector style | |||
|  - asteroids, original star wars, tempest | |||
|  - all lines, no shading | |||
| CRTs are based on an electron gun firing electrons at a screen | |||
|  - screen is coated in phosphor, so it glows when hit | |||
| With vector graphics, computer controls direction, movement of electron gun | |||
|  - direction controlled by electromagnets | |||
| Nice thing about vector graphics is they are relatively cheap, computationally | |||
|  - just have to store, process info on how to direct the beam | |||
| But not so flexible | |||
|  - creating text is painful, looks pretty bad | |||
| So, vector graphics were replaced by raster graphics | |||
|  - pixels rather than directions for an electron gun | |||
| Basic abstraction - a frame buffer | |||
|  - part of RAM that is associated with the screen | |||
|  - change a bit in the frame buffer, the corresponding part of the screen | |||
|    changes | |||
| 8-bit computers like the Apple II worked this way | |||
|  - just change memory values to get drawings on the screen | |||
| When we talk about VRAM, in there there are frame buffer(s) that are mapped to the screen | |||
|  - more closely corresponds to hardware now with LCDs | |||
| Frame buffers allow for fine-grained control, but...they are expensive | |||
|  - one bit per pixel, at a minimum | |||
|  - old computers, this was difficult | |||
| When data is too much, how do we manage? | |||
|  - represent it procedurally, i.e. make programs to generate the bits we want | |||
|  - really, a form of compression | |||
| Because we need much more than just the raw framebuffer | |||
|  - we need the data that we put in the framebuffer | |||
| Text terminals had hard-coded fonts | |||
|  - fonts were "rasterized" by hand, stored in rom | |||
|  - legacy lives in terminals we use for command lines, emulate "vt100" and such | |||
|  - fonts could have characters representing arbitrary bit patterns | |||
|    - character-based graphics, see Commodore 64 | |||
|    - we still do this, that's what a tilemap basically is | |||
| In principle, we have everything we need to do arbitrary graphics | |||
|  - at most, add in a second framebuffer so we can do "double buffering", i.e., | |||
|    render to one buffer while the other is displayed | |||
|  - at most, add color, i.e., multiple bits per pixel | |||
| GPUs are all about speeding up the generation of data to go into frame buffers | |||
|  - solution at the end of a long evolution | |||
|  - GPUs will probably go away eventually, replaced by computational cores | |||
| First, consider 2D graphics | |||
|  - drawing of lines, shapes (polygons, circles/ellipses) | |||
|  - mathematically, though, aren't shapes really simple? | |||
|    - but we have to "rasterize" them onto a fixed grid that will be mapped to | |||
|      pixels | |||
| The rasterization problem is one key problem that remains computationally expensive | |||
|  - gets harder with the more complex things to display | |||
| But we also want to support arbitrary text | |||
|  - so now need to support fonts | |||
|  - fonts require transferring arbitrary bit patterns to the frame buffer | |||
|     - and if font is not pre-rasterized, have to do that too | |||
| Truetype, PostScript Type 1 fonts all have to be rasterized | |||
|  - but, they can contain "hints" which direct how this happens at low resolution | |||
| To give you an idea of the expense, old laser printers were more powerful, | |||
| computationally, than the computers that drove them | |||
|  - computers worked at much lower resolutions | |||
|  - 72 dpi vs 300+ dpi | |||
|  - but laser printer was just converting vector info to pixels | |||
| GUIs make things even more complex | |||
|  - rasterization plus movement | |||
|  - moving windows, mouse, icons, etc | |||
|  - movement on screen is equivalent to moving patterns of bits | |||
|    - memcpy | |||
|  - if the main CPU is involved with copying, it isn't doing anything else | |||
|  - so we can have hardware to accelerate the bit copying | |||
|    - "blitter" | |||
|    - copies do not have to be byte-aligned, and can be selected with masks | |||
| blitter + 2D acceleration (hardware-assisted drawing of shapes, fonts) | |||
| gets you enough for GUIs, 2D games | |||
|  - sprites are a specialized blitter | |||
| 3D graphics makes this all much, much harder | |||
| Still have the rasterization problem | |||
|  - but now we are rasterizing 3D vector models to 2D | |||
| And we still have animation, movement | |||
|  - but in 3D coordinates, not 2D | |||
| We have the math to do things very accurately, but in practice we use approximations | |||
|  - but we're getting closer and closer to using the original math | |||
| It all comes down to lighting, and the physics of lighting | |||
| To do a 2D view of a 3D scene, we have to have a "camera" | |||
|  - all a camera is, is a perspective from which to render 3D to 2D | |||
| What is a camera (of any kind) actually doing? | |||
|  - capturing light | |||
| We actually have physics-based models of how light works | |||
|  - could simulate quantum mechanics to get full details, only | |||
|    barrier is computational expense | |||
| Light is photons being exchanged between atoms | |||
|  - all 3D graphics is an approximation of this | |||
| This phenomena is *very* complex | |||
|  - the more we can approximate it, the more graphics can look like reality | |||
| What you've learned in previous courses are just approximations of this | |||
|  - that look pretty good yet are compuationally less expensive | |||
| Graphics is always a trade-off between art and physics/math | |||
|  - art judges when the math is good enough, | |||
|    helps us select what approxmations work | |||
|  - when we get lazy with the art, we rely on math | |||
| Zelda games tend to have great art but are not very "realistic" | |||
|  - note that even rendering traditional animation is not so easy | |||
| We aren't that far from oil painters | |||
|  - converting rough materials to visually pleasing patterns | |||
| Raytracing | |||
|  - that is trying to approximate how light scatters in real life | |||
|  - but even so, it is still an approximation | |||
| What is lighting, actually? | |||
|  - we have a 3D model and a camera position | |||
|    - how would light come to the camera? | |||
|  - we can approximate this by just having every object have its own light | |||
| </pre> | |||
Latest revision as of 13:58, 18 March 2021
What goes in a GPU, or, why are GPUs so complicated?
Topics
2D: problems
- bits and displays
- text
- animation
- GUIs
2D: solutions
- vector graphics vs raster graphics
- 2D rasterization
- frame buffers
- display lists
- sprites
- blitter
- GUIs and fixed-function 2D
- parallel processing & 2D
3D: problems
- the 3D->2D problem
- the lighting problem
- the surface problem
- the movement/animation problem
3D: solutions
- 2D rasterization, polygons, triangle meshes (surfaces)
- textures
- cameras
- ray tracing
- rendering pipelines
- parallel processing & 3D
Notes
Raster vs vector graphics
Vector graphics
 - based on CRT technology
 
Old video games are in this pure vector style
 - asteroids, original star wars, tempest
 - all lines, no shading
CRTs are based on an electron gun firing electrons at a screen
 - screen is coated in phosphor, so it glows when hit
With vector graphics, computer controls direction, movement of electron gun
 - direction controlled by electromagnets
Nice thing about vector graphics is they are relatively cheap, computationally
 - just have to store, process info on how to direct the beam
But not so flexible
 - creating text is painful, looks pretty bad
So, vector graphics were replaced by raster graphics
 - pixels rather than directions for an electron gun
Basic abstraction - a frame buffer
 - part of RAM that is associated with the screen
 - change a bit in the frame buffer, the corresponding part of the screen
   changes
8-bit computers like the Apple II worked this way
 - just change memory values to get drawings on the screen
When we talk about VRAM, in there there are frame buffer(s) that are mapped to the screen
 - more closely corresponds to hardware now with LCDs
Frame buffers allow for fine-grained control, but...they are expensive
 - one bit per pixel, at a minimum
 - old computers, this was difficult
When data is too much, how do we manage?
 - represent it procedurally, i.e. make programs to generate the bits we want
 - really, a form of compression
Because we need much more than just the raw framebuffer
 - we need the data that we put in the framebuffer
Text terminals had hard-coded fonts
 - fonts were "rasterized" by hand, stored in rom
 - legacy lives in terminals we use for command lines, emulate "vt100" and such
 - fonts could have characters representing arbitrary bit patterns
   - character-based graphics, see Commodore 64
   - we still do this, that's what a tilemap basically is
In principle, we have everything we need to do arbitrary graphics
 - at most, add in a second framebuffer so we can do "double buffering", i.e.,
   render to one buffer while the other is displayed
 - at most, add color, i.e., multiple bits per pixel
GPUs are all about speeding up the generation of data to go into frame buffers
 - solution at the end of a long evolution
 - GPUs will probably go away eventually, replaced by computational cores
First, consider 2D graphics
 - drawing of lines, shapes (polygons, circles/ellipses)
 - mathematically, though, aren't shapes really simple?
   - but we have to "rasterize" them onto a fixed grid that will be mapped to
     pixels
The rasterization problem is one key problem that remains computationally expensive
 - gets harder with the more complex things to display
But we also want to support arbitrary text
 - so now need to support fonts
 - fonts require transferring arbitrary bit patterns to the frame buffer
    - and if font is not pre-rasterized, have to do that too
Truetype, PostScript Type 1 fonts all have to be rasterized
 - but, they can contain "hints" which direct how this happens at low resolution
To give you an idea of the expense, old laser printers were more powerful,
computationally, than the computers that drove them
 - computers worked at much lower resolutions
 - 72 dpi vs 300+ dpi
 - but laser printer was just converting vector info to pixels
GUIs make things even more complex
 - rasterization plus movement
 - moving windows, mouse, icons, etc
 - movement on screen is equivalent to moving patterns of bits
   - memcpy
 - if the main CPU is involved with copying, it isn't doing anything else
 - so we can have hardware to accelerate the bit copying
   - "blitter"
   - copies do not have to be byte-aligned, and can be selected with masks
blitter + 2D acceleration (hardware-assisted drawing of shapes, fonts)
gets you enough for GUIs, 2D games
 - sprites are a specialized blitter
3D graphics makes this all much, much harder
Still have the rasterization problem
 - but now we are rasterizing 3D vector models to 2D
And we still have animation, movement
 - but in 3D coordinates, not 2D
We have the math to do things very accurately, but in practice we use approximations
 - but we're getting closer and closer to using the original math
It all comes down to lighting, and the physics of lighting
To do a 2D view of a 3D scene, we have to have a "camera"
 - all a camera is, is a perspective from which to render 3D to 2D
What is a camera (of any kind) actually doing?
 - capturing light
We actually have physics-based models of how light works
 - could simulate quantum mechanics to get full details, only
   barrier is computational expense
Light is photons being exchanged between atoms
 - all 3D graphics is an approximation of this
This phenomena is *very* complex
 - the more we can approximate it, the more graphics can look like reality
What you've learned in previous courses are just approximations of this
 - that look pretty good yet are compuationally less expensive
Graphics is always a trade-off between art and physics/math
 - art judges when the math is good enough,
   helps us select what approxmations work
 - when we get lazy with the art, we rely on math
Zelda games tend to have great art but are not very "realistic"
 - note that even rendering traditional animation is not so easy
We aren't that far from oil painters
 - converting rough materials to visually pleasing patterns
Raytracing
 - that is trying to approximate how light scatters in real life
 - but even so, it is still an approximation
What is lighting, actually?
 - we have a 3D model and a camera position
   - how would light come to the camera?
 - we can approximate this by just having every object have its own light