John Tsiombikas nuclear@mutantstargoat.com
21 June 2011
That's it, I finally found something fun in web development! I never thought I'd live to see the day when I would feel the motivation to learn javascript, but here we are. WebGL is fun, because you can do all the things you could with regular OpenGL, but now you can send URLs to all your friends to show off. I can't say I liked javascript really, but I guess it’s passable as long as you can avoid the horrible conventions people have established for pretending to write object-oriented code with it.
So what I did, after experimenting to see how WebGL and javascript programming works, is a port of a GPU-raytracer for 4D quaternion Julia fractals, and a simple 360-panorama viewer. You can find those on my webgl hacks page I put up yesterday.
About WebGL itself now, I'm really disappointed they chose to base it on OpenGL ES 2.0, which is the bastard child of a slashed down OpenGL subset initially spec'ed for fixed point embedded devices, and Khronos’ OpenGL >= 3 d3d10-buttlicking madness. I understand why they chose that, because they intend to have WebGL easily implementable on mobile phones and tablets, but I'm still disappointed.
For those of you not well versed in the differences between the various OpenGL versions that suddenly crept up when Khronos group took control of OpenGL and apparently surrendered it over to inmates of the nearest insane asylum, I'll give you a short overview of what sucks in OpenGL >= 3.x, OpenGL ES 2.0, and WebGL:
glBegin
). Again, yes immediate mode is slow if you use
it to draw multimillion vertex meshes, but having to make a vertex buffer
for a quad representing a button in a GUI or a simple overlay, is insanity.GL_QUADS
.So anyway, while I was playing around with it these past few days, I had to bring back a little bit of sanity to WebGL. For that reason I wrote SaneGL, a small piece of code that implements immediate mode drawing, and the OpenGL matrix stack on top of WebGL. I bundled that along with a small matrix math library and some helper functions for WebGL programs in a project called webgl-tools, which you can find in my mercurial repository: http://nuclear.mutantstargoat.com/hg/webgl-tools.
Oh by the way, if you're one of those misguided sods that keep using windows, and you try to run any webgl apps right now you will probably be disappointed. In an unprecedented inspiration of pure stupidity, both firefox4 and chrome chose to implement WebGL over Direct3D by default on windows, using a project called ANGLE. The reason for that, they say, is that most graphics card vendors provide buggy OpenGL implementations on windows, so apparently it makes sense to write an even more buggy OpenGL->D3D translator and use that.
Initially I thought that ANGLE fails to translate huge shaders such as the one
on my fractal raytracer, but in fact it seems to fail on pretty much
everything, complex or trivial. The only way for windows users to use WebGL at
the moment until mozilla and google comes to their senses and make ANGLE a
fallback for known buggy OpenGL implementations instead of the default choice,
is to go and force the browsers to use OpenGL instead. On firefox you can do
that by setting the about:config
variable "webgl.prefer-native-gl
" to true,
while chrome requires the command-line argument: –use-gl=desktop
.
On GNU/Linux, as long as you have an nvidia card everything should be peachy
from the get-go. Other cards are apparently blacklisted by firefox, so you'll
have to set webgl.force-enable
to true, and pray to Odin.
This was initially posted in my old wordpress blog. Visit the original version to see any comments.