Recent posts

#31
General Discussion / Re: Transition from Discord
Last post by Ramon - Feb 13, 2026, 03:34 AM
Thank you for migrating here, forums were a great thing and social media/apps should have never replaced them. That and downloading software instead of having web apps and services with subscription models should be a trend.
#32
Art Showcase / Tried redesigning my pfp in fr...
Last post by Nyvyme - Feb 13, 2026, 01:01 AM
noware-logo-frutier-aero.png

Based on my slackware-themed wallpaper which is heavily inspired by FreeBSD logo.
slackware-wallpaper-square-small.png
#33
Project Showcase / my IRC proof of concept
Last post by spirodonfl - Feb 12, 2026, 11:01 PM
* Supports utf-8 (tested and confirmed)
* Uses existing chrome install instead of loading an entire new one (like node webkit does)
* Runs at about 120mb of memory based on what I can see on Windows

I can send a compiled exe or maybe an installer to anybody interested
#34
Project Showcase / Showing off my CSS3D Programme...
Last post by spirodonfl - Feb 12, 2026, 09:44 PM
https://spirofloropoulos.com/css3dtabletop/

It's just a proof of concept but

* No AI
* All vanilla code (as in, no 3rd party libraries)
* CSS3D for all 3d effects

Coming soon
* WASM
* An updated table
* Deck builder

Long term
* PVP
* Spend money to get better cards
* Probably some other stuff I'm forgetting right now

How to play:

The first table is meant to setup your deck. Right now, you can only discard 3 cards of your choosing and have the dot matrix printer give you a new random card (hopefully a better one). That's it. Start the time travel to start the battle.

The battle is a series of 3 phases per turn and you have to go through several bosses to get to the end, defeat the startup building the AI.

The phases are "discard", "play card", "play augment". You get 5 cards in your hand. Discard any one of them during the discard phase (only one) to get another random card from your deck. You can skip this phase. Play a card now. You want to increase the bit flips on your opponent. You also want to increase your own ECC because that defends against the bosses attempted bit flips on you.

Just think of bit flips as health that you want to keep at 0 and your ECC is your defense, which you want to increase.

You can also skip the "play card" phase.

Playing an augment is limited to influencer, hardware, language and os cards. They will get put on the tabletop as active augments. Whatever the stats of that card is will be positively added to any card you play in the future. Right now it also affects the opponents card positively so you both get a boost. Future versions will make it so augments you've played only affect you.

That's it. Max out the bosses bit flips and win.
#35
Graphics Programming / Re: Bindless Rendering
Last post by travisvroman - Feb 12, 2026, 08:11 PM
Excellent article, and thanks for submitting this! You might want to convert the markdown to bb markup instead, though.
#36
Welcome / Join us on IRC!
Last post by travisvroman - Feb 12, 2026, 07:48 PM
We're moving live chat to IRC. It just makes more sense for an open-source project than the walled garden that is Discord.

TL;DR - Here's the info to access it.

Server (uses SSL):
irc.libera.chat


Port:
6697


Channel:
#kohi


At the moment, the channel is not password protected.

Details
Accessing it is easy. Either use your favourite IRC client (I use Konversation on Linux), or just use the web client provided at Libera.

Input the connection details above and you should be able to hop right in and chat!

IMPORTANT!
Note that IRC does not maintain chat history. If it's something that might need to be referred to in the future, make it a forum post instead. The chat is not there for support.
#37
General Discussion / Transition from Discord
Last post by travisvroman - Feb 12, 2026, 07:40 PM
This message accompanies the one left on the Discord server, but this thread is to discuss this move and it's details. Keep it nice and productive, please!

Announcement left on Discord (modified slightly for formatting):

Due to the recent announcements by Discord, we will be migrating away from this as the primary community platform. I do not agree with the decision to require identity verification for any purpose just to have a community where folks can meet up and chat - and I don't trust their ability to keep it secure, as they've been hacked and leaked data numerous times in the past.

Discord is going to be replaced by 2 things:


They serve 2 distinct purposes:

The forum should contain anything that should maintain a historical record and be searchable/re-visitable in the future - topics such as support and questions that others might need, or discussions that need additional context like links or images. The forum will serve as the primary resource for the community, and the central source of truth for all discussions around Kohi and Shadows of Illumina.

The IRC chat is really an extension of the forum, and is really only to be used for casual conversation in a more immediate environment. Note that, due to the nature of how IRC works, chat history there is not saved. This is why I say to prefer the forum.

This change accomplishes a few things. First, it dispenses with the "walled garden" that is Discord (i.e. it isn't searchable via the web or without having a login, etc.). This is a huge point, and honestly one I was considering anyway long before Discord made these announcements. Second, sometimes old school and simple is best. Communities switching from using forums to using these centralized and walled gardens was a mistake, and afforded these companies far too much power over its users and communities in ways that almost always winds up being abused. This is an attempt to right that wrong in our own way. Third, there won't be any advertising in our forums or IRC channel like there is on Discord. I get they are out to make money, but it's constant - with no signs of lightening up. This way, the only person bearing cost to run these things is me (although you all do help, and that is greatly appreciated), and I am okay with that.

So what's the plan? Discord plans to roll out these changes sometime next month, so we'll be transitioning most things that need saving out of the Discord server and into the forums between now and then. This has already been started, in fact. Log anything that you think should be saved into the Suggestion Board on the forums. It would help out immensely. Anyway, we will slowly begin locking down channels and marking them as read-only as time continues. Note that the server will never be completely shut down, but there will be messages left for anyone coming in to go to the forums instead. The only channel I plan to leave open long-term will be #general, purely so that there's somewhere for new folks to land before being directed back out of Discord. As for chat, IRC is something we are trying as an experiment. Maybe we'll stick with it if it works, maybe try something else if not, but I don't want to trade one walled garden for another.

That's all there is for now. In the coming weeks, announcements will instead be made over at the forums instead of in Discord.

Edit: One more thing, if voice chat ever becomes something widely requested (it wasn't used all that much on Discord) I will setup a TeamSpeak server.

Edit 2: Fixed some formatting and forwarded links to appropriate forum equivalents.
#38
General Discussion / Re: Just an appreciation post
Last post by travisvroman - Feb 11, 2026, 12:59 PM
Much appreciated, my dude! Thanks for always being around. :)
#39
General Discussion / Just an appreciation post
Last post by spirodonfl - Feb 11, 2026, 12:52 PM
Thanks for setting this up @Travis. Thanks for all the work on Kohi and for helping people like me learn more about programming.
#40
Graphics Programming / Bindless Rendering
Last post by DrElliot - Feb 11, 2026, 10:00 AM
Bindless Rendering Overview

Bindless rendering is a GPU resource model where shaders access buffers and textures directly through GPU-resident handles instead of being restricted by per-draw descriptor bindings. Traditional APIs require resources to be explicitly bound to slots before a draw call. Bindless removes that slot-based indirection and allows shaders to index into large arrays of resources using opaque GPU pointers or descriptor indices.

Classic binding model:

  • You bind N textures and M buffers to fixed slots.
  • Each draw call is constrained to those bound resources.
  • Changing materials typically means rebinding descriptor sets or root signatures.

Bindless approach:

  • All resources live in large descriptor arrays (or are exposed via GPU virtual addresses).
  • Shaders receive an index or handle per draw/instance/material.
  • The shader fetches the resource dynamically.
  • The CPU no longer rebinding descriptors per draw.

Conceptual difference

Traditional:
Bind(Texture0);
Draw();
Bind(Texture1);
Draw();

Bindless:
material.textureIndex = 42;
DrawIndirect();

Shader:
Texture2D textures[]; // large descriptor array
color = textures[material.textureIndex].Sample(...);

Key Properties

  • Descriptor arrays are very large (often unbounded in Vulkan with descriptor indexing).
  • Resources are not rebound per draw.
  • Shaders select resources dynamically.
  • GPU-driven rendering pairs naturally with this model.

API Support

Vulkan:
  • VK_EXT_descriptor_indexing
  • Runtime descriptor arrays
  • Non-uniform indexing
  • Descriptor buffers (VK_EXT_descriptor_buffer)

DirectX 12:
  • Descriptor heaps
  • Root descriptors
  • Shader-visible descriptor tables

OpenGL:
  • ARB_bindless_texture
  • 64-bit GPU texture handles

Why It Matters

  • Reduces CPU overhead – no descriptor rebinding per material change; massive improvement in draw-call heavy scenes.
  • Enables GPU-driven rendering – indirect draws or mesh shaders allow GPU selection of materials/resources without CPU intervention.
  • Simplifies material systems – materials become data (indices into global tables) instead of state transitions.
  • Scales to large content sets – thousands of textures/materials can exist simultaneously without rebinding churn.

Common Architecture Pattern

  • Global descriptor heap / descriptor set with:
    • All textures
    • All structured buffers
    • All material buffers
  • Each material stores indices into these arrays.
  • Draw commands reference a material index.
  • Shader fetches material data → fetches texture indices → samples.

Example Material Buffer
struct Material
{
uint albedoIndex;
uint normalIndex;
uint metallicRoughnessIndex;
};

Shader flow
Material m = Materials[materialIndex];
Texture2D albedo = Textures[m.albedoIndex];

No CPU descriptor updates per draw.

Tradeoffs

  • Requires modern hardware.
  • Non-uniform indexing must be handled correctly.
  • Descriptor management becomes global and long-lived.
  • Debugging can be more complex.
  • Memory pressure increases if not carefully managed.

Performance Characteristics

Bindless improves CPU scalability more than raw GPU speed. The GPU cost is similar unless the previous model caused pipeline stalls or descriptor heap switches. The real gains appear in:

  • Large scenes with many materials
  • GPU-driven indirect rendering
  • Forward+ / clustered lighting
  • Meshlet / mesh shader pipelines