Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Locked thread
pfs Write
Jun 29, 2014

get/save/remove
i love demos (c64 mostly) because its like the computer equivalent of urbex in abandoned buildings/sewers filled with graffiti. there is always something a little unnerving about them. pretty amazing what they can achieve too

nothing like that technicolor chrome effect from the color palette on the c64 also SID chip

Adbot
ADBOT LOVES YOU

minivanmegafun
Jul 27, 2004

Snapchat A Titty posted:

i remember there were some short ones that basically just switched between pre-rendered images very quickly to simulate greyscale, but that was all on like TI-82/3s.

found a guy who hacked up a sound out thing lol:
https://www.youtube.com/watch?v=ksoavrKHIRc

the TI-99/4A ain't a calculator

it appears in one of the cozpops, so i guess that would make it an ideal platform for doing a yospos demo

thehustler
Apr 17, 2004

I am very curious about this little crescendo

What was the thread this came from again?

Edit: was it the yospos bitch thread with people finding new and unique ways to say yospos with code and poo poo?

thehustler fucked around with this message at 02:27 on May 30, 2015

spankmeister
Jun 15, 2008






good thread

spankmeister
Jun 15, 2008






http://keygenjukebox.com/ for all your beep boop needs

thehustler
Apr 17, 2004

I am very curious about this little crescendo
This is the best cracktro music

http://youtu.be/7K5wrFI_iJI

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang



minato posted:

It was for a number of reasons. You could reduce memory usage by selecting fewer bitplanes, at the expense of fewer colors. And because you could move odd/even bitplanes separately, it made it easier to do foreground/background movement independently.

The Blitter took care of rendering sprites to the right pixels, but if you wanted to do per-pixel image-processing operations (like plasma effects, or image rotations, etc) then you had to do some crazy tricks to pull that off.

Thankfully the Blitter could also render lines and fill areas, making non-textured 3D graphics much easier. But texture-mapping was very difficult.

this one does something kindof in the ballpark of texturemapping, i think, but: no real turns, its p much all "zoom and strafe" for lack of better words. from like 0:10 to 0:40

https://www.youtube.com/watch?v=_5HacABiXUE

then later there are some rotating zooms that are pretty cool. intel outside :getin:

minato
Jun 7, 2004

cutty cain't hang, say 7-up.
Taco Defender

Snapchat A Titty posted:

this one does something kindof in the ballpark of texturemapping, i think, but: no real turns, its p much all "zoom and strafe" for lack of better words. from like 0:10 to 0:40

https://www.youtube.com/watch?v=_5HacABiXUE

then later there are some rotating zooms that are pretty cool. intel outside :getin:
That's a really nice demo, there's a lot going on there under the hood. I think it must have been run on an A4000 though, that 3D stuff at the end was well beyond what a stock Amiga could do at 7.14Mhz.

Conventional image rotation/zoom algorithms "walk" over the destination buffer at a constant speed and copy pixels from the source image at a variable speed / direction. On the Amiga this approach doesn't work well because a there are 8 pixels to a single byte, and multiple bytes-per-pixel for each bitplane. It's straightforward to create an efficient pixel writer that works on consecutive pixels, but not so easy to make a pixel reader that can move in arbitrary speeds/directions across the source image. Without optimizations, reading from source image (X,Y) means:

byte offset = y * (imagewidth / 8) + x / 8
pixel mask = 1 << (7 - x % 8)
read (image base address + byte offset)
AND with pixel mask
now a non-zero value means the pixel bit was 1, otherwise 0, so write that to the destination buffer
x = (x + x_speed) % image width
y = (y + y_speed) % image height
[loop around for the next dest image pixel]

This algorithm is way too slow, even for a 128x128 destination image.

But, you can optimize the above heavily by modifying the source image (at the cost of multiplying its size by 8 times). Instead of storing it 1 bit per pixel, make the pixels 1 byte per pixel. (0x00/0xff if original pixel value was 0/1 respectively). This simple transformation means you can avoid the 3 divides in the above loop, and doesn't require a pixel mask at all for the read. And if you set the image width/height to a power of 2, then the " % image [width|height]" becomes a simple AND operation. So the optimized version of the loop becomes:

byte_offset = y << (ln2 imagewidth) + x
read (image base address + byte offset)
AND with destination pixel mask
x = (x + x_speed) & (ln2 imageheight)-1
y = (y + y_speed) & (ln2 imagewidth)-1

... which is 1 shift and a couple of adds per source read. Much more efficient.

Carthag Tuek
Oct 15, 2005

Tider skal komme,
tider skal henrulle,
slægt skal følge slægters gang



thx for the detailed post i just gotta say real quick re:

minato posted:

I think it must have been run on an A4000 though

no, this is exactly as it runs on a vanilla amiga 500 (w 1 mb ram, i forgot if that was an expansion or not). i had one and played that demo for months when i got it. it did not run on a later cdtv which was basically the same hw except +AGA, and with a different ram layout (chip/fast/slow) and workbench 2.0 (boo) instead of 1.3 (yay)

echinopsis
Apr 13, 2004

by Fluffdaddy
almost natlie portmans birthday...

Snapchat A Titty posted:

(w 1 mb ram, i forgot if that was an expansion or not).

it was

echinopsis
Apr 13, 2004

by Fluffdaddy

minato posted:

That's a really nice demo, there's a lot going on there under the hood. I think it must have been run on an A4000 though, that 3D stuff at the end was well beyond what a stock Amiga could do at 7.14Mhz.

Conventional image rotation/zoom algorithms "walk" over the destination buffer at a constant speed and copy pixels from the source image at a variable speed / direction. On the Amiga this approach doesn't work well because a there are 8 pixels to a single byte, and multiple bytes-per-pixel for each bitplane. It's straightforward to create an efficient pixel writer that works on consecutive pixels, but not so easy to make a pixel reader that can move in arbitrary speeds/directions across the source image. Without optimizations, reading from source image (X,Y) means:

byte offset = y * (imagewidth / 8) + x / 8
pixel mask = 1 << (7 - x % 8)
read (image base address + byte offset)
AND with pixel mask
now a non-zero value means the pixel bit was 1, otherwise 0, so write that to the destination buffer
x = (x + x_speed) % image width
y = (y + y_speed) % image height
[loop around for the next dest image pixel]

This algorithm is way too slow, even for a 128x128 destination image.

But, you can optimize the above heavily by modifying the source image (at the cost of multiplying its size by 8 times). Instead of storing it 1 bit per pixel, make the pixels 1 byte per pixel. (0x00/0xff if original pixel value was 0/1 respectively). This simple transformation means you can avoid the 3 divides in the above loop, and doesn't require a pixel mask at all for the read. And if you set the image width/height to a power of 2, then the " % image [width|height]" becomes a simple AND operation. So the optimized version of the loop becomes:

byte_offset = y << (ln2 imagewidth) + x
read (image base address + byte offset)
AND with destination pixel mask
x = (x + x_speed) & (ln2 imageheight)-1
y = (y + y_speed) & (ln2 imagewidth)-1

... which is 1 shift and a couple of adds per source read. Much more efficient.

this owns

Samizdata
May 14, 2007
And no one even MENTIONS the joy of MOD files for music? And Scream Tracker? Disappointing, lads, disappointing.

GameCube
Nov 21, 2006

Samizdata posted:

And no one even MENTIONS the joy of MOD files for music? And Scream Tracker? Disappointing, lads, disappointing.

nobody mentions it because it's loving self evident

GameCube
Nov 21, 2006

wait til the lads in yospos hear about these Module Files

minato
Jun 7, 2004

cutty cain't hang, say 7-up.
Taco Defender
A lot of MOD file authors went on to some success, mostly in the game industry. Some had more success than others, notably DJ Eric Prydz packed out Madison Square Garden recently.

Luigi Thirty
Apr 30, 2006

Emergency confection port.

the guy who did the Tyrian music when he was 19 later went on to do basically every unreal engine game and is also a voice actor now

Farmer Crack-Ass
Jan 2, 2001

this is me posting irl

atari VCS?

Wheany
Mar 17, 2006

Spinyahahahahahahahahahahahaha!

Doctor Rope
the old successful finnish game development companies (remedy and housemarque) had a background in the demo scene

atomicthumbs
Dec 26, 2010


We're in the business of extending man's senses.
i rly like the music in this one

https://www.youtube.com/watch?v=IFXIGHOElrE

Zlodo
Nov 25, 2006

minato posted:

That's a really nice demo, there's a lot going on there under the hood. I think it must have been run on an A4000 though, that 3D stuff at the end was well beyond what a stock Amiga could do at 7.14Mhz.

Filled polygon 3d was perfectly fine for an old 7mhz Amiga as the blitter was able to render filled polygons and I'm p sure I remember Arte to work just fine on on a500. The CPU only had to transform the vertices and clip the polygons. In most case there was no lighting although some did Lambert shading (which is just a dot product per polygon but the annoying part is you needed to have gradients in your color palette)

There were quite a few games in those days that managed to do 3d w/ solid polygons on Amiga 500. I remember starglider ii that was even doing it running at a solid 60 fps (it was made by argonaut software who went on to design the superfx chip and make starfox for Nintendo)

As you said it was texturing that was hard because of the video memory format that wasn't suited to the CPU changing individual pixels easily which required a "chunky to planar" conversion routine, which cost a lot of CPU even if well optimized

The earliest amiga demo I remember doing textured stuff and gouraud shading was origin: http://www.pouet.net/prod.php?which=3741
It also ran on non aga amiga and it blew my mind at the time ("wow they're computing stuff for each pixel")

Zlodo fucked around with this message at 12:13 on May 30, 2015

Cocoa Crispies
Jul 20, 2001

Vehicular Manslaughter!

Pillbug
per-pixel rendering got a lot easier when GPUs and shaders went ubiquitous

this is a 4k PC demo, shorter than a Tom Collins post

https://www.youtube.com/watch?v=auagm5UBTwY

Edit: and here's how it works http://iquilezles.org/www/material/function2009/function2009.htm

Cocoa Crispies fucked around with this message at 14:18 on May 30, 2015

spankmeister
Jun 15, 2008






here's a 64k one that's really good

https://www.youtube.com/watch?v=gfk5Mqy3gpA

spankmeister
Jun 15, 2008






also this is a pretty neat documentary about ~teh scene~


it focuses a bit too much on Finnish and Hungarian groups but it's a good doc nonetheless

make sure to turn on subs

https://www.youtube.com/watch?v=iRkZcTg1JWU

Symbolic Butt
Mar 22, 2009

(_!_)
Buglord
this is a good thread

ymgve
Jan 2, 2004


:dukedog:
Offensive Clock
demoscene combined with touhou, in 170 kbytes

https://www.youtube.com/watch?v=fu7rRYkWsyk

ymgve
Jan 2, 2004


:dukedog:
Offensive Clock
to make up for that, have the (arguably) best c64 demo ever

https://www.youtube.com/watch?v=Zp3oEJemnz0

Nintendo Kid
Aug 4, 2011

by Smythe

Snapchat A Titty posted:

with a different ram layout (chip/fast/slow)
why was this a thing anyway


anyway i like this demo a lot because its the only one for the system its on:
https://www.youtube.com/watch?v=1q-4Ie5wjus

minato
Jun 7, 2004

cutty cain't hang, say 7-up.
Taco Defender

Zlodo posted:

The CPU only had to transform the vertices and clip the polygons.
Yup, and therein lies the rub.

The traditional way to do 3D is to combine all your rotation/scaling/translation operations into a 4x4 matrix and use it to transform 4x1 3D vectors, followed by a multiply by 1/w at the end to normalize them to a (screenx,screeny,z) tuple. But obviously a stock Amiga 500 had no floating point and terrible MUL/DIV performance (~70/~160 cycles respectively - we should at least be thankful we had multiply and divide, I don't think the C64 does), so vertex transform require a lot of tricks to do it at speed in volume:

- use sine/cosine lookup tables instead of calculating them on the fly
- loop unrolling (doesn't matter how long your unrolled loops are, you don't have to worry about instruction-cache-thrash because there is no cache!)
- perform "ghetto" SIMD. Instead of multiplying A*X then A*Y separately with a MUL (2*70=140 cycles), calculate result=A*(X << 16 | Y), then A*Y = result & 0xffff, and A*X = (result >> 16). This is 1 MUL + some shifting/masking, which is < 100 cycles. But you have to choose your data carefully to avoid overflows.
- hard-coded matrix elements (e.g. you're probably not scaling so that part of the matrix is 0/1, so those operations can be skipped)
- Avoid screen x/y transformation by having your base screen address be the middle of the screen (more MULs/ADDs to skip)
- MUL each vector element by 1/W, not DIV each item by W since DIV was twice as slow as MUL
- Choose camera angles so that the model doesn't go off the edge of the screen (so you can avoid having to clip lines), or simply make the screen memory larger than the visible screen area.

Once the verts are transformed, then each polygon is processed, starting with a cross-product of 2 adjacent vectors to see if the polygon is actually visible. That's 3 MULs, 2 ADDs and a comparison. This is expensive to do for each polygon. Careful choice of model data helps here; for example, with those tie-fighters at the end of the Arte demo, they can use symmetry and co-planarity to reduce the number of visibility checks:
- determine polygon visibility for just 1 poly on the flat side of the "wing". Since other polys on the wing are coplanar, they share the same visibility.
- exploit data symmetry. The visibility of a poly on a wing is the opposite to its corresponding poly on the other wing.
- share data. If two tie fighters are facing in the same direction at all times, then they have the same poly visibility data.
... so with 1 cross-product calculation, you've determined the visibility of a poo poo-ton of polys.

Then you've got Z sorting. There is no Z buffer, so you've got to draw back-to-front with the painter's algorithm. The traditional (and slow) way is to make a list of all the polys to draw, sort the list (an O(n log n) operation if you're smart), and draw furthest to nearest. A smarter way is to use Z-slots. This is a linked list of linked lists. The list starts out with each sub-linked list pointing to the head of the next sub-linked list, and each head is a NOP operation:

[0 NOP ]-> [1 NOP] -> [2 NOP] -> ... [N STOP]

Then to add a polygon to draw at distance Z, you normalize Z to between [0->N), and insert it into the sub-linked list at that point. (The insertion happens in O(1) time because it's just an array lookup to find the head of the target sub-linked list). Then to render all the polys, you just walk the whole linked list, drawing polygons as you go. (FWIW, this is how the PlayStation 1 GPU did Z-sorting because it didn't have a Z-buffer either).


The real tricky problem with Amiga rendering is that it was necessary to clip polygons with respect to other polygons. The blitter could draw the outlines of polygons and fill them in, but it was too dumb to handle the case if lines from 2 different polygons intersected. Performing poly-to-poly clipping is expensive and painful, so tricks were used to avoid it. For example, its known that for a convex object, none of its polys will intersect. So draw two convex objects on different bitplanes, and then sort the bitplanes. This is like drawing the two objects on separate pieces of cellophane, and then sorting the cellophane.

quote:

In most case there was no lighting although some did Lambert shading (which is just a dot product per polygon but the annoying part is you needed to have gradients in your color palette)
There was a trick here too. If you want shading with (say) 8 colors, then once you've calculated the polygons color, you have to render the same poly to potentially 3 bit planes. This is going to be expensive. Can we get the same number of colors with less writes?

Well, the Blitter had a little-used "mask" mode where it could pull data from multiple sources and combine it together before writing. Some demos configured the blitter to either fill polygons with all 1s (mask-mode = off), or enable mask-mode and fill with all 1s AND'd with a mask of alternating 1s and 0s in a checkerboard pattern. The checkerboard pattern looked half as bright as the same poly filled with all 1s, so you get an "extra" color with fewer bits.

Put another way:
Old way: 8 actual colors, rendered across 3 bitplanes. Color 4 is filled with as [all 1s][all 0s][all 0s] and 5 with [all 1s][all 0s][all 1s]
Cheaper way: 4 actual colors (but looks like 8), rendered across 2 bitplanes. Color 4 is filled with [all 1s][all 0s] and 5 as [all 1s][checkered 1s/0s]



I was only about 14 when I was doing all this stuff, and although I figured out 3D, I had no concept of matrix math or image processing techniques. A lot of the demo tricks that blew my mind at the time seem really obvious with the 20/20 hindsight and a college degree.

Mr. Nice!
Oct 13, 2005

c-spam cannot afford



thehustler posted:

What was the thread this came from again?

Edit: was it the yospos bitch thread with people finding new and unique ways to say yospos with code and poo poo?

i don't remember the original thread but that isn't even the original video. this is:

https://vimeo.com/11241456

Zlodo
Nov 25, 2006

minato posted:

The real tricky problem with Amiga rendering is that it was necessary to clip polygons with respect to other polygons. The blitter could draw the outlines of polygons and fill them in, but it was too dumb to handle the case if lines from 2 different polygons intersected. Performing poly-to-poly clipping is expensive and painful, so tricks were used to avoid it. For example, its known that for a convex object, none of its polys will intersect. So draw two convex objects on different bitplanes, and then sort the bitplanes. This is like drawing the two objects on separate pieces of cellophane, and then sorting the cellophane.
I don't think people ever bothered handling intersecting polygons before z buffers - I know we didn't in playstation 1 games. Artists had guildelines such as "don't make long polygons, subdivide them into smaller ones" so that polygon sorting would work without too much artifacts. (and it helped make texturing look less lovely back when it was not perspective-corrected)

I remember at least one demo where clipping polygons against each other in real time was actually done as a standalone "look what we managed to do" effect though: https://www.youtube.com/watch?v=MyfxuIjdjfE at 1:37 (:nws: because boobs near the end of the demo)

quote:

There was a trick here too. If you want shading with (say) 8 colors, then once you've calculated the polygons color, you have to render the same poly to potentially 3 bit planes. This is going to be expensive. Can we get the same number of colors with less writes?

Well, the Blitter had a little-used "mask" mode where it could pull data from multiple sources and combine it together before writing. Some demos configured the blitter to either fill polygons with all 1s (mask-mode = off), or enable mask-mode and fill with all 1s AND'd with a mask of alternating 1s and 0s in a checkerboard pattern. The checkerboard pattern looked half as bright as the same poly filled with all 1s, so you get an "extra" color with fewer bits.

I had never really investigated the dithering tricks at the time but I figured that there had to be blitter tricks behind them.

one I liked was the true color trick that TBL came up with using ham mode:
https://www.youtube.com/watch?v=C2CTSY6JbVY (:nws: because boobs too)

I had figured that one out and re-implemented that one. It was basically using aga's ham8 (http://en.wikipedia.org/wiki/Hold-And-Modify) at super-hires (1280 pix wide resolution) where 4 native pixels would be used to represent one "logical" pixel, with the first pixel setting the red value of the pixel, the second one would set the green, third one the blue and last one would just be set to "repeat previous pixel color as is". The 6 lower bit were filled using a special chunky to planar conversion that basically took true color, 18-bit per pixel data and shoving in into the 6 lsb of each pixel (and doubling the blue channel accross two successive pixels)

I had managed to cod ea few effects like blur and a gouraud software renderer with that but like everything I did back then I never finished anything with it

just watched tint again and I didn't remember how garrish it was, then again the whole point was to show off their fancy "look at them colors" technique

quote:

I was only about 14 when I was doing all this stuff, and although I figured out 3D, I had no concept of matrix math or image processing techniques. A lot of the demo tricks that blew my mind at the time seem really obvious with the 20/20 hindsight and a college degree.

same

minato
Jun 7, 2004

cutty cain't hang, say 7-up.
Taco Defender
The HAM stuff is pretty cool, I guess it was really underused because it was so difficult to write tools for. It was fine for scanned images, but artists must have hated modifying a pixel and sometimes seeing distortion to the pixels to the right. I recall there was some HAM demo that used both the copper and the CPU to furiously rewrite the color palette every scanline to achieve even more colors on the screen, but it meant the CPU was so busy that it couldn't have any other effects.

The demo scene seemed to segment around '94. At that point, you had ECS/AGA Amigas filtering in so people with older hardware couldn't see the demos, and those AGA demos seemed like they were for a different platform - it wasn't ever clear to me how much heavy-lifting the ECS/AGA was doing. Combine that with PCs starting to take off as gaming devices, and DOS4GW making it really easy to write 32-bit PC programs, and that signaled the era of demos with a minimum hardware requirement (as opposed to an exact one).

There was, for a while, a resurgence of the demo scene on game console hardware, but the closed nature of the systems prohibited development.

ymgve posted:

to make up for that, have the (arguably) best c64 demo ever

https://www.youtube.com/watch?v=Zp3oEJemnz0
I'm blown away by this, even more so after going back and watching that "Utimate Guide to the C64" video I posted on the first page. And it's a well-designed demo too, not just technically brilliant.

Luigi Thirty
Apr 30, 2006

Emergency confection port.


yeah it's just adding 1 to the color index each scanline for player graphics and the background which everything did

Segmentation Fault
Jun 7, 2012

Luigi Thirty posted:

the guy who did the Tyrian music when he was 19 later went on to do basically every unreal engine game and is also a voice actor now

Alex Brandon owns and his non-game albums own too. I have a physical copy of Just Fun and I really wish I could get one of Violet Eclectic

Speaking of people who worked on Tyrian, the artist Daniel Cook is now a game designer along with being an artist, he heads up Spry Fox and he did the art and game design for Triple Town. He also has a blog where he discusses game design and art, and he has a bunch of his old pixel art and new art he offers for free to budding game developers

oh no blimp issue
Feb 23, 2011

i was gonna try and do a lovely demo on the gba but i decided i cant be bothered today
maybe you'll get a flashing neon YOSPOS BITHC tomorrow

Shame Boy
Mar 2, 2010

the french friend that I mentioned which originally started the whole demo discussion in the security thread stopped by to check out this thread, said he was happy to see groups like melon get posted :3:

hi buddy :wave:

EMILY BLUNTS
Jan 1, 2005

i still like the second song in this a whole lot

https://www.youtube.com/watch?v=oUSypR004Wo

and this part of another demo:
https://youtu.be/jX0UgvgBuQc?t=691

EMILY BLUNTS fucked around with this message at 04:43 on May 31, 2015

Cocoa Crispies
Jul 20, 2001

Vehicular Manslaughter!

Pillbug

there's a high note right at the top edge of my hearing on that one, it's physically painful to listen to :(

EMILY BLUNTS
Jan 1, 2005

Cocoa Crispies posted:

there's a high note right at the top edge of my hearing on that one, it's physically painful to listen to :(

yes everything using this trick seems to have an artifact like this at the the sample rate

Do The Evolution
Aug 5, 2013

but why

Cocoa Crispies posted:

https://www.youtube.com/watch?v=iQqJm14sHRY

loving cool even if the sega genesis was a reliable predictor of growing up to a gross weird internet user

that is cool as gently caress. im the robot doing barbell curls

Adbot
ADBOT LOVES YOU

Segmentation Fault
Jun 7, 2012
Here's a tech demo for the Sega 32x, made in 1995 to show off what the device could do

https://www.youtube.com/watch?v=pOWZbydnlZE

zyrinx was a game development studio made up of amiga demoscene people, including Jesper Kyd who is imo the best Yamaha FM composer ever

One of their games is Red Zone which is pretty much a playable demoscene demo

https://www.youtube.com/watch?v=NQxU2CIVb3c

some of the assets in the Sega 32x demo show up in AMOK, an action game for the Saturn which is also a playable demoscene demo

https://www.youtube.com/watch?v=HGGpEnV_0SM

  • Locked thread