Sign in

Ruben Osorio

@osor.io
347 followers 91 following 65 posts

Senior VFX/Graphics Programmer working @ Rockstar Games All posts/opinions/views my own :) Website at osor.io

PostsRepliesMedia
Ruben Osorio @osor.io · 28/08/2026
Warms my heart to see the everyone's excitement 🧡 Finally people can imagine how amazing it is to be part of this graphics team. 🔥 Especially proud of VFX art who made all that effort worth it, from every big fire, splash and smoke to the wee sparks, dust and blood 💥 youtu.be/tJbzMqJGH4k?...
youtu.be
Grand Theft Auto VI: An Extended Look
YouTube video by Rockstar Games
3322
Ruben Osorio @osor.io · 06/07/2026
Alex: "I use it crudely" Also Alex: ☝️
140
Ruben Osorio @osor.io · 28/05/2026
Indeed! Used this a while ago to make a 24-bit hash optimized for GPU and got some really really good wins compared to the commonly used version of PCG out there. The full-rate 24-bit multiply-adds are the real workhorse of it 🧡 www.shadertoy.com/view/l3K3zR
shadertoy.com
062
Ruben Osorio @osor.io · 22/12/2025
Hello graphics Bluesky! 🧡 I heard through the grapevine that my colleague Daniil Smoliakov is looking for new opportunities! He's one of the most talented and tireless people I've ever seen at work so he deserves the praise 😊 Try and get him while you can! 🏃💨 www.linkedin.com/in/daniil-sm...
linkedin.com
046
Ruben Osorio @osor.io · 18/09/2025
My favourite flavour of this is “x86 is interpreted”. Such a high ragebait hit-rate 😜
020
Ruben Osorio @osor.io · 12/07/2025
They’ll have to pry the idea of accumulating samples from my cold dead hands 😝
110
Ruben Osorio @osor.io · 12/07/2025
Thanks so much Albert! 🧡 🟥🟩🟦 Give us the sub-pixels!!! 🟥🟩🟦
110
Ruben Osorio @osor.io · 28/06/2025
I don't have plans to do it right now but maybe at some point in the future if time allows 😊 Part of the message I'm trying to send here is that this isn't too hard to do. I'd love for people to have a go with their own implementations and share improvements if they can! 🧡
010
Ruben Osorio @osor.io · 18/06/2025
It’s an honour to be featured 🤗 Thank you so much! ❤️
010
Ruben Osorio @osor.io · 12/06/2025
Screenshots not a great strength either I see 😅 The high-res stuff is in the post anyway, like this one with a bunch of different fonts rendered at high res straight out of the test app I was running this on: osor.io/text/lorem_i...
020
Ruben Osorio @osor.io · 12/06/2025
Oh no! 😝
010
Ruben Osorio @osor.io · 12/06/2025
Video is still not Bluesky's forte eh? Here's a screenshot! 🙃
Image of a joke fake article over a blue background, it reads:

Breaking: Graphics Programmer Does Text Again!

The rabbithole police has been called to the codebase after sightings of an anonymous graphics programmer onanistically replacing their whole text rendering implementation.

'It's just a waste of time' said a witness of the large changelists submitted to the repository; "SDFs looked pretty good, I really don't understand" said a former colleage of the suspect.

An in-depth article will follow expanding on the alleged wrongdoings of the perpetrator.

More news at eleven.
160
Ruben Osorio @osor.io · 12/06/2025
My first one one got an unexpected amount of interest. Huge thanks to everyone who read it! (Especially @jendrikillner.bsky.social since he was probably the biggest reason 😄) This topic gets way more coverage but I've never seen it done/presented like this, so trying to make my contribution 🙏
150
Ruben Osorio @osor.io · 12/06/2025
Hola again graphics peeps! 😊 I found myself with enough bits and pieces related to text rendering to warrant a write-up. So here it is! 😱 osor.io/text Spiced up with direct vector rendering, sub-pixel anti-aliasing, run-time atlas packing, temporal accumulation, and more! I hope you enjoy it! 🧡
44812
Ruben Osorio @osor.io · 22/05/2025
The most sensible approach is obviously that half res and quarter res *both* mean half in each axis / quarter of the pixels. 🧨🧨🧨🧨🧨🧨🧨
010
Ruben Osorio @osor.io · 10/05/2025
Hey! Thanks so much! 🙌 Unfortunately it was a one-off build since I don’t have much time these days for this kind of project 😔 I would encourage people to attempt their own custom builds though. Or look for custom controller/arcade-stick builders directly since there’s some already out there 🙏
010
Ruben Osorio @osor.io · 06/05/2025
Thanks man! 🙏
000
Ruben Osorio @osor.io · 06/05/2025
Gracias Andrés! ❤️
010
Ruben Osorio @osor.io · 06/05/2025
Been quiet but busy Hope you all like it! 🧡 rockstargames.com/VI www.youtube.com/watch?v=VQRL...
rockstargames.com
Grand Theft Auto VI - Rockstar Games
Vice City, USA. Jason and Lucia have always known the deck is stacked against them. But when an easy score goes wrong, they find themselves on the darkest side of the sunniest place in America, in the...
9281
Ruben Osorio @osor.io · 06/03/2025
Brain played it with the exact cadence and slapped the music right after 🙃
010
Ruben Osorio @osor.io · 01/01/2025
The first active thread of the wave does the atomic and retrieves the global offset for the wave, WaveReadLaneFirst then broadcasts it. The local offset within the wave comes from WavePrefixCountBits, since it's just the count of how many threads with a lower index are also writing one element.
010
Ruben Osorio @osor.io · 01/01/2025
If you need the correct index per-thread, as you do when you're going to write the samples to the buffer, there's some more wave-ops involved, since you also need to calculate the local offset for each thread on the wave. WaveReadLaneFirst/WavePrefixCountBits sorts you out, here is how it'd look:
110
Ruben Osorio @osor.io · 01/01/2025
Oh! Also worth mentioning. In this sort of system you'll see a lot of contention when writing to shared counters. It's a good idea to minimize this by doing the global write once per wave or group. A neat trick is to also scalarize on the shader/draw for when a wave sees different values there 🙃
110
Ruben Osorio @osor.io · 31/12/2024
Paying my respects with a video rendering 10% of the pixels each frame (hacking this in just now so turning all denoising and TAA off, no reprojection of "empty" pixels either 😜). (Prepare for the bsky video butchering though)
130
Ruben Osorio @osor.io · 31/12/2024
@adrien-t.bsky.social also made me aware of @h3r2tic.bsky.social's amazing presentation in h3.gd/a-deferred-m.... Super cool to see the per-draw lists and all the spatial and temporal VRS experiments ❤️
h3.gd
A deferred material rendering system
Technobabble and nonsense
110
Ruben Osorio @osor.io · 31/12/2024
And because this approach ends up compacting the list of pixels per-draw, it responds really well to scenes with heavy dithering into the visibility buffer. Some of the other tile-based approaches I tried struggled with this, since they'd need to dispatch multiple resolve tiles per tile on-screen.
100
Ruben Osorio @osor.io · 31/12/2024
Plus you also can select variations of the shaders to further optimize! If a pixel is not seeing any local lights, you can dispatch a version of the resolve shader that has all the local light code compiled out. Or if a pixel is fully in shadow from directional light, nuke all that code too, etc...
100
Ruben Osorio @osor.io · 31/12/2024
I *really* like the flexibility of this approach while keeping the resolve waves full. With this you can do software VRS easily, both spatially and temporally, which is super cool! You can just write any logic to decide how the visibility buffer values map to a sample to resolve.
100
Ruben Osorio @osor.io · 31/12/2024
There's only a few waves per-frame that see two or more draws when resolving, which are the only cases where the waves aren't fully utilized. This is as good as it can be anyway, if those waves weren't going to shade another draw, they would have been inactive in a "wave-perfect" resolve anyway.
100
Ruben Osorio @osor.io · 31/12/2024
This can include a lot of data like per-draw transforms, tinting, material stuff, and notoriously also including the bindless texture indices. Nice not to need any of that NonUniformResourceIndex uglyness.
100
Ruben Osorio @osor.io · 31/12/2024
Because the list is not only sorted per-shader but also per-draw, most of the waves will just see one draw! To take advantage of this, I scalarize based on the draw index, so all of the draw-related data can be uniform and stay in scalar registers. With a noticeable win in occupancy too 😊
100
Ruben Osorio @osor.io · 31/12/2024
The resolve is dispatched per-shader, not per-draw, so it's still a very manageable amount of dispatch indirect calls. As in, a single one for all your variations of standard, anisotropic, whatever... so there isn't a ton of concerns about empty dispatch indirect arguments.
100
Ruben Osorio @osor.io · 31/12/2024
Tried writing them once unsorted then sorting, but like I imagined, is just too expensive. I do believe you could make something like this work if you tiled the whole resolve and kept the working set of in local memory though. You need enough tiles/work in flight to feed a big GPU though.
110
Ruben Osorio @osor.io · 31/12/2024
To collect the lists, I first count how many pixels each draw and shader want, then allocate space in a big buffer for each shader, then allocate space for each draw within the chunk allocated for their shader. Then repeat the same logic but writing the pixels to the buffer with the right offset.
110
Ruben Osorio @osor.io · 31/12/2024
Tried a few ways to resolve a visibility buffer as a nightly adventure a few days ago 😄 So far my favourite I could come up with is collecting lists of pixels per shader, internally sorted per draw, then a dispatch indirect per shader scalarizing on the draw index. Plus it can have cute bugs! 🙃 🧵
Bunch of blurry colours together, a fun bug while looking at strategies for resolving visibility buffer.
1100
Ruben Osorio @osor.io · 20/11/2024
Hmm, pretty yikes. Here's a screenshot for reference 🙃
Capture of the single video showed earlier. Just some text with some formatting and line wrapping.
010
Ruben Osorio @osor.io · 20/11/2024
🪦 for the 720p video. Bluesky was destroying the small/timeline version of it otherwise. Let's see how a 1440p one shows? 🤔
110
Ruben Osorio @osor.io · 20/11/2024
Spent a wee bit implementing some 🫰 rich-ish 🫰 text with support for *bold* and _italic_ annotations plus some cheeky line wrapping. Here's the beginning of a possible future post running through it 📄 Also "Look ma, no textures!" Just tracing them rays agaist them beziers ❤️
140
Ruben Osorio @osor.io · 16/11/2024
Indeed! Hoping for so many more of these. Those were some great chats 🧨
010
Ruben Osorio @osor.io · 16/11/2024
A great one! We were so lucky to meet you and all the JangaFX gang. The *JangangFX* perhaps from now on? 🙃
110
Ruben Osorio @osor.io · 16/11/2024
Added a small section to osor.io/OIT about a neat way to avoid self-occlusion when sampling transmittance 😊 It came up in conversation enough times that it's worth updating instead of waiting for a new post ❤️ Also, some peeps asked for a clip with less & slower spheres intersecting so here it is! 🙏
0313
Ruben Osorio @osor.io · 16/11/2024
Graphics Programming Conference was incredible ❤️ So many notes to go through, ideas to investigate, people to talk to and games to play! 🔥 Thank you so much to the organizers and all the attendees, it was such a pleasure to meet you all 😊 Can we have Texels sponsor next year though? 🍻🙃
3 graphics people drinking some “Texels” branded beer.
3414
Ruben Osorio @osor.io · 15/11/2024
Nice! Great stuff 😊 I’m looking forward to the next dev blog already 😁 I don’t know when they’ll post them but keep an eye on @h3r2tic.bsky.social’s talk on Tiny Glade from GPC. Their DoF solution in there is so satisfying and elegant ❤️
020
Ruben Osorio @osor.io · 15/11/2024
Thanks so much! 🙌
010
Ruben Osorio @osor.io · 11/11/2024
Very excited to be at the Graphics Programming Conference at Breda this week with my guy @angelortiz.bsky.social! 😊😊 If you wanna meet up or have a chat (or 🍻🍻) drop us a message! ❤️
0141
Reposted by Ruben Osorio
Chloe | VFX Artist @chloemay.bsky.social · 09/11/2024
Spreading the love, a thread of effects I can't stop thinking about. Starting with this scene in Arcane S01E08, like naaaaaaaaah, every frame is 😘
2405
Ruben Osorio @osor.io · 09/11/2024
@gameengines.bsky.social I would like the custom engine label please! ❤️ Thanks for setting all this up btw! 😊
000
Ruben Osorio @osor.io · 05/11/2024
Thanks so much Alex! 🙏
000
Ruben Osorio @osor.io · 05/11/2024
This topic doesn't get as much love as I'd like, so props to those who *do* work on stuff like this. To everyone that worked on wavelet and moment-based transparency, phenomenological, and a loooong etc. ❤️ (Can't find people to tag besides @morgan3d.bsky.social and @kostasanagnostou.bsky.social 🙃)
020
Ruben Osorio @osor.io · 05/11/2024
Hola graphics people! ❤️ I've been meaning to do some write-ups that are hopefully useful, so this first one is about my approach to Order-Independent Transparency. osor.io/OIT 🙌Super excited to finally release this!🙌 I hope you enjoy it!
79931