It's such a fabulous tool as the generated images can be used for effects like glass/ice displacements, cheap water-like effects, but you can also generate terrains from it or just cool visual effects that benefit from random patterns. The core property to me is that it feels very organic/natural.
This was such a common tool in Flash AS3 back in the days to create stunning effects, games and such. I'm not active in building visual stuff like that anymore but I bet it's still very common in this field, because why not?
Or you could just start with ASCII... I was discussing how shaders work with a friend and wound up hacking together a sort of "shadertoy" that runs in Emacs last night. Scroll to end of file to see examples...
Neat. It'd be more "ASCII" if it used 8x16 pixel (but right extended to 9x16) characters in 80:133 width:height aspect ratio since 80x25 characters at 720x400 on 4:3 results in 80:133 pixels. An arbitrary sized canvas is cool so long as the aspect ratio is preserved.
The infamous MCGA/"VGA" mode 13h had pixels with an aspect ratio 6:5, while 320 x 240 Mode X was square (1:1).
I still remember the unchained offset calculation for the memory offset for pixel memory access before the era of U and V pipes and many optimizing compiler passes:
unsigned short offset = (((y << 2) + y) << 6) + x;
unsigned char far *ptr = (unsigned char far*)MK_FP(0xA000, offset);
// IIRC: #define MK_FP(seg, off) ((void far *)((unsigned long)(seg) << 16 | (unsigned long)(off))) // far pointers != linear address
Yes you're right in that it's not real ASCII, but more ASCII-esque. I took some artistic liberty to do everything on the GPU, if I had done true ASCII I would have had to move data back to the CPU and render the glyphs there. However it was too slow and didn't have the desired effect I was seeking.
I am considering building out an additional feature set where it allows for true ASCII rendering, but we'll see if I get around to that.
Infamous means famous but for a bad reason, basically notorious. I've noticed a lot of people making this mistake recently, as well as people using ignorant to mean stupid. But I digress...
Many of us have that mode 13h stuff memorised too, including the 0x3c8 and 0x3c9 palette registers etc. And since 320x200 bytes is less than 65536 you don't need to do any segment stuff to access the full frame buffer.
This is cool... But I feel like having different color/brightness for each symbol kinda defeats the purpose of it being ASCII when the symbols only correspond to different intensities anyway.
Author here, I understand where you are coming from. However I did choose to keep it this way as it generally looks better. I toyed with other methods and I may introduce them in as a setting.
Was experimenting with something similar... working on a modern QWK reader, and this is kind of a core thing to deal with, rendering ansi in messages as html. (synchronet color codes don't work right and renegade color codes untested).
Was an initial experiment with Claude Code, but kind of a cool result that's pretty close to what I want.
Author here, yeah I apologize for the misnomer. I could render it with actual ASCII but it was too slow because of needing to process it on the CPU. My method here is actually done all on the GPU and draws glyphs similar to how fonts are drawn. Well actually I'm using signed distance functions to draw the glyphs, but the glyphs are ASCII-esque.
This looks like a good way to model "satellite-view clouds" where you render "the full atmosphere". I don't think it would work well when modeling "ground-view clouds" however. I have been looking for a good (fast) algorithm for doing that, would appreciate it if people have pointers for that.
Author here. Interesting point about the satellite-view clouds, I'm not very familiar with that domain. But I can point you to the article I read about domain warping on top of noise, which is what I use to produce this effect.
It dies with lots of WebGL errors here, so I only see a white page. So that's definitely not ASCII in my book. Would be more fun to have an actual text based output indeed.
Hey, I'm the author here. Can't believe this got so much attention! I appreciate all of the kind words and feedback. I recently updated the tool to more easily share what you create through the url or you can export a PNG/WEBM. Would love to see what you make with it, please tag me c:
If you're interested in seeing more of what I work on, follow me on my socials where I post everyday.
Author here, love that you tried to recreate the Balatro background. I was also similarly obsessed with that game last year. If you were able to recreate it I’d love to see, I just added more sharing capabilities to the tool.
Just throwing a HELL YES <with a kung fu punch> out there for this. Nice work. I've been trying to integrate a live ascii video feature for a while now and the subtle detail on this is really inspiring.
Author here. Thanks so much for the rad reply and enthusiasm! So glad I could help inspire you, and please feel free to use this for any art you make, just tag me on socials or send it my way so I can check it out.
Really like it, only thing some of the cells can be jittery and rapidly switch back and forth between two symbols, making for an unpleasant effect, maybe there is a way to smooth this?
Nice. This looks similar to what I have implemented: https://www.npmjs.com/package/asciiground, but I intended it more as a library where a user could program their own patterns by extending the existing systems. Sadly, my GitHub account got flagged, so there is no way to access the repository or GitHub pages for the demo at the moment.
You can render only single characters. First you need to change the HTML "max" attribute of <input> to 1.1 in the "Glyph Thresholds". And set 0.0 for the desired characters and the characters above. Set 1.1 for the remaining characters.
For example, if you only want the dash, set the dot and dash to 0.0. Then set 1.1 for the plus, ring, and cross characters.
Author here. That’s a nice trick! I’ve been pondering on how to handle this but I think I’m going to allow the ability to toggle on/off the presence of glyphs so that you don’t have to muck around with the thresholds to get them to not render.
Author here. Wow that's so cool! I've never heard of browsh but it's so cool to see that my site (which was built to be as static as possible) works well and even renders the WebGL in the terminal. Thanks for sharing!
Author here. Haha that's so creative! I definitely thought about lowering the limit, but then it wouldn't really be ASCII-esque lol. I might just lower it so that you don't have to do this workaround.
Author here. Not ridiculous at all, the name is a bit of a misnomer. I had tried doing true ASCII but moving data back to the CPU to render it all was too slow. So I opted to recreate them as glyphs that are drawn using signed distance functions, which gets pretty close to looking like real ASCII while still being incredibly performant due to it never leaving the GPU.
Author here. This is all done on the GPU using shaders. It's a few layers, and you can find the details over on my Bluesky post, feel free to read it there. I've been thinking about making a blog post covering how I went about building it.
It's a fun experiment into WebGL and graphics programming. I intended it to be a cool tool for getting inspiration for designing and creating other art in general. I do eventually want to build this out into a larger set of tools that would allow you to quickly iterate and build out various aesthetics for designing.
In it's current state, it's mostly practical for creating pretty images and videos that you could use in other projects. If there's more interest I could possibly turn it into more, would love to hear ideas and suggestions!
Author here, yes you're correct. The name is a bit of misnomer, and to do it truly with ASCII I'd have to move data back to the CPU which had pretty bad performance. I took a bit of artistic liberty and decided to draw my own ASCII-esque glyphs using signed distance functions. I'm considering adding a setting to swap the modes so that it does use true ASCII but again it'd be pretty rough performance on large screens.
madethemcry|1 month ago
It's such a fabulous tool as the generated images can be used for effects like glass/ice displacements, cheap water-like effects, but you can also generate terrains from it or just cool visual effects that benefit from random patterns. The core property to me is that it feels very organic/natural.
This was such a common tool in Flash AS3 back in the days to create stunning effects, games and such. I'm not active in building visual stuff like that anymore but I bet it's still very common in this field, because why not?
cess11|1 month ago
https://p5js.org/reference/p5/noise/
evilturnip|1 month ago
greggman65|1 month ago
https://post-processing.tresjs.org/guide/pmndrs/ascii
https://forum.babylonjs.com/t/ascii-shader-using-glsl-postpr...
https://threejs.org/examples/?q=ascii#webgl_effects_ascii
https://fwdapps.net/l/asci/
https://codesandbox.io/p/sandbox/ascii-postprocessing-n628p8...
https://www.youtube.com/watch?v=NxeRcnLr0ko
oofoe|1 month ago
https://hg.sr.ht/~oofoe/shademacs/browse/sdf.el?rev=tip
burnt-resistor|1 month ago
The infamous MCGA/"VGA" mode 13h had pixels with an aspect ratio 6:5, while 320 x 240 Mode X was square (1:1).
I still remember the unchained offset calculation for the memory offset for pixel memory access before the era of U and V pipes and many optimizing compiler passes:
In real-mode (linear): 0xa0000 + (320 * y) + xmildmelon|1 month ago
Yes you're right in that it's not real ASCII, but more ASCII-esque. I took some artistic liberty to do everything on the GPU, if I had done true ASCII I would have had to move data back to the CPU and render the glyphs there. However it was too slow and didn't have the desired effect I was seeking.
I am considering building out an additional feature set where it allows for true ASCII rendering, but we'll see if I get around to that.
pixelpoet|1 month ago
Many of us have that mode 13h stuff memorised too, including the 0x3c8 and 0x3c9 palette registers etc. And since 320x200 bytes is less than 65536 you don't need to do any segment stuff to access the full frame buffer.
ksymph|1 month ago
mildmelon|1 month ago
intrasight|1 month ago
Bimos|1 month ago
block_dagger|1 month ago
tracker1|1 month ago
Was an initial experiment with Claude Code, but kind of a cool result that's pretty close to what I want.
https://github.com/bbs-land/bbs-ansi-to-html
mildmelon|1 month ago
otikik|1 month ago
mildmelon|1 month ago
https://iquilezles.org/articles/warp/
ku1ik|1 month ago
xwiz|1 month ago
chriscjcj|1 month ago
http://nkwiatek.com/experiments/ascii
mildmelon|1 month ago
kristopolous|1 month ago
and the code: https://github.com/kristopolous/ascsee
I just updated it so it compiles on modern systems.
I also found the original version if you like being an archaeologist: https://9ol.es/tmp/gol.c
mildmelon|1 month ago
sang459|1 month ago
mildmelon|1 month ago
pj4533|1 month ago
https://github.com/pj4533/asciidelic https://asciidelic.com
I should go back and add mobile support, maybe fullscreen support.
mildmelon|1 month ago
scaradim|1 month ago
binaryturtle|1 month ago
mildmelon|1 month ago
If you're interested in seeing more of what I work on, follow me on my socials where I post everyday.
Bluesky: https://bsky.app/profile/caidan.dev Twitter: https://x.com/caidanwilliams Threads: https://www.threads.com/@ancientsunshine
matthew_hre|1 month ago
mildmelon|1 month ago
TyrunDemeg101|1 month ago
mildmelon|1 month ago
ynac|1 month ago
mildmelon|1 month ago
alexcz|1 month ago
mildmelon|1 month ago
ZpJuUuNaQ5|1 month ago
haritha-j|1 month ago
mildmelon|1 month ago
lasgawe|1 month ago
mildmelon|1 month ago
plastic041|1 month ago
For example, if you only want the dash, set the dot and dash to 0.0. Then set 1.1 for the plus, ring, and cross characters.
mildmelon|1 month ago
some1else|1 month ago
https://srdjan.pro
mildmelon|1 month ago
efilife|1 month ago
firecall|1 month ago
yanchep|1 month ago
mildmelon|1 month ago
sandos|1 month ago
mildmelon|1 month ago
fxn2|1 month ago
mildmelon|1 month ago
casparvitch|1 month ago
mildmelon|1 month ago
drob518|1 month ago
mildmelon|1 month ago
NSPG911|1 month ago
mildmelon|1 month ago
onde|1 month ago
publicdebates|1 month ago
mildmelon|1 month ago
baalimago|1 month ago
mildmelon|1 month ago
lanyard-textile|1 month ago
arionmiles|1 month ago
imdsm|1 month ago
imvetri|1 month ago
mildmelon|1 month ago
https://bsky.app/profile/caidan.dev/post/3mcdwifkfvc2o
intrasight|1 month ago
mildmelon|1 month ago
Padriac|1 month ago
mildmelon|1 month ago
It's a fun experiment into WebGL and graphics programming. I intended it to be a cool tool for getting inspiration for designing and creating other art in general. I do eventually want to build this out into a larger set of tools that would allow you to quickly iterate and build out various aesthetics for designing.
In it's current state, it's mostly practical for creating pretty images and videos that you could use in other projects. If there's more interest I could possibly turn it into more, would love to hear ideas and suggestions!
keyle|1 month ago
imvetri|1 month ago
heliumtera|1 month ago
mildmelon|1 month ago
r0075h3ll|1 month ago
mildmelon|1 month ago
hairozen|1 month ago
mildmelon|1 month ago
tomiezhang|1 month ago
mildmelon|1 month ago
functionmouse|1 month ago