Reincarnation, revisited

Reading over yesterday’s post, I had a sense of deja vu. And then I realized why: I was not talking about something in the future, but rather about something in the past.

When I developed the first general purpose procedural shader language, back in early 1984, there were no GPUs. Which means that I was operating with fewer constraints.

My key innovation was to run a fully featured custom designed computer program at every pixel. Because I was operating on a general purpose CPU, I was able to design my shader language any way I wanted.

One feature that I put in was to have vectors and matrices as primitive data types, and operations between them as native operations. This was, after all, a programming language for graphics.

But another feature that I included was a Lisp-like semantics. I could define lightweight functions at any time, and then use them as a kind of shorthand.

So my shader language ended up being, like Lisp or APL, a sort of meta-language. As I added new operators, it got progressively easier to use the language to define and experiment with procedural lighting and textures.

This is not the way today’s GPU languages work. They tend to be very rigid in their structure and data typing, because they are trying to make it easier for the compiler to optimize the code you write.

But I suspect that as GPU compilers continue to evolve, that old wheel of reincarnation will continue to spin, and people will be able to program for the GPU with the same flexibility that I was enjoying over 40 years ago in the world’s very first shader language.

Leave a Reply

Your email address will not be published. Required fields are marked *