Archive for January, 2008
GPU Caps Viewer en Chine
GPU Caps Viewer est en train de se balader un peu partout autour de la planète web, et je viens de le découvir en Chine où il a posé ses valises le temps de faire chauffer quelques GPUs chinois…

Le lien: www.greendown.cn
Attention aux yeux, ça clignote de partout!
A cumbersome bug in the Catalyst 7.12

The latest Catalyst version is the 7.12 (the Cat7.12 internal number is 8.442.0.0). But exactly like the Cat7.11, these drivers have a bug in the management of dynamic lights in GLSL. But this time, I searhed for the source of bug because this bug is a little bit cumbersome in Demoniak3D demos. And we can’t use a previous version since Cat7.11+ are required to drive the radeon 3k (HD 3870/3850). Then I’ve coded a small Demoniak3D script that shows the bug. This script displays a mesh plane lit by a single dynamic light. The key SPACE allows to switch the GLSL shader: from the bug-ridden to the fixed and inversely.
- The following image shows the plane enlightened with the fixed shader:

- The following image shows the plane lit with the bug-ridden shader:

Okay that’s cool, but where does the bug come from ? After a little time spent on shaders tweaking, my conclusion is that the bug is localized in the value of the built-in uniform variable gl_LightSource[0].position. In the vertex shader, this variable should contain the light position in camera space. It’s OpenGL that does this transformation, and we, poor developers, just need to specify somwhere in the C++ app the light position in world coordinates. In the vertex shader, gl_LightSource[0].position helps us to get the light direction used later in the pixel shader:
lightDir = gl_LightSource[0].position.xyz - vVertex;
With the Catalyst 7.11 and 7.12, the value stored in gl_LightSource[0].position is wrong. Then, one workaround, until the ATI driver team fix the bug, is to manually compute the light pos in camera space by passing to the vertex shader the camera view matrix and the light pos in world coord:
vec3 lightPosEye = vec3(mv * vec4(-150.0, 50.0, 0.0, 1.0)); lightDir = lightPosEye - vVertex;
mv is the 4×4 view matrix and vec4(-150.0, 50.0, 0.0, 1.0) is the hard coded light pos in world coord.
In the fixed pipeline, dynamic lights are well handled as shown in the next image:
In the Demoniak3D demo, the bug-ridden GLSL shader is called OneDynLightShader and the fixed one OneDynLightShader_Fixed. The demo source code is localized in the OneDynLightTest.xml file. To start the demo, unzip the archive in a directory and launch
DEMO_Catalyst_Bug.exe.
The demo is downloadable here: Demoniak3D Catalyst 7.11/7.12 Bug
This bug seems to affect all radeons BUT under Windows XP only. Seems as if ATI is forcing people to switch to Vista. Not cool… Or maybe ATI begins to implement OpenGL 3.0 in the Win XP drivers. Do not forget that with OpenGL 3.0 as with DX10, the fixed functions of the 3D pipeline like the management of dynamic lights will be removed.
Les Catalyst 7.12 toujours à la sauce “Bug-Inside”

Les derniers pilotes Catalyst ont la version 7.12 (le numéro interne des Cat7.12 est le 8.442.0.0 – c’est pas un téléphone ok!). Mais exactement comme les 7.11, ces drivers ont un bug dans la gestion des lumières dynamiques en GLSL. Mais cette fois-ci, je me suis mis à la recherche du bug car il est un peu, voire très génant pour les demos Demoniak3D. J’ai donc pondu un petit script Demoniak3D qui met en évidence ce bug. Ce script montre un mesh plan éclairé par une lumière dynamique. Un appui sur la touche SPACE permet de changer de shader GLSL: on passe du shader bogué au shader corrigé et inversement.
- L’image suivante montre le plan éclairé avec le shader corrigé:

- L’image suivante montre le plan éclairé avec le shader bogué:

okay tout ceci est bien, mais d’oû vient le bug? Après avoir passé un peu de temps à tweaker les shaders, j’en suis arrivé à la conclusion que le bug se situe au niveau de la valeur contenue dans la variable uniforme built-in gl_LightSource[0].position. Au niveau du vertex shader, cette variable contient la position de la lumière exprimée l’espace de la caméra. C’est OpenGL qui effectue cette transformation, à notre niveau il suffit de spécifier la position de la lumière en coordonnées du monde. Au niveau du vertex shader, gl_LightSource[0].position nous permet de calculer la direction de la lumière utilisée plus tard dans le pixel shader:
lightDir = gl_LightSource[0].position.xyz - vVertex;
Avec la Radeon HD 3870 et les Catalyst 7.11 et 7.12, la valeur contenue dans gl_LightSource[0].position est fausse.
Donc le workaround que je propose en attendant que la driver team d’ATI corrige le bug, est de passer au vertex shader la position de la lumière exprimée dans les coordonnées du monde ainsi que la matrice de vue de la camera et de faire la transformation à la main:
vec3 lightPosEye = vec3(mv * vec4(-150.0, 50.0, 0.0, 1.0)); lightDir = lightPosEye - vVertex;
mv représente la matrice 4×4 de vue de la caméra et vec4(-150.0, 50.0, 0.0, 1.0) représente la position de la lumière en coordonnées du monde.
Au niveau pipeline fixe, les lumières dynamiques sont bien gérées comme le montre l’image suivante:
Au niveau de la démo Demoniak3D, le shader GLSL bogué est appelé OneDynLightShader et celui corrigé OneDynLightShader_Fixed. Le code source de la démo Demoniak3D se trouve dans le fichier OneDynLightTest.xml. Pour lancer la demo, dézippez l’archive dans un répertoire
et lancez DEMO_Catalyst_Bug.exe.
La démo est téléchargeable ici: Demoniak3D Catalyst 7.11/7.12 Bug
Ce bug affecte toutes les radeons MAIS sous Windows XP uniquement. On dirait qu’ATI nous force un peu la main pour passer sous Vista. Pas trop sympa… Ou alors ATI commence à implémenter OpenGL 3.0 dans les drivers XP. Car n’oublions pas qu’avec OpenGL 3.0, tout comme avec DX10, les fonctions fixes du pipelines 3D comme la gestion des lumières dynamiques sont supprimées.
Je voudrais remercier la communauté WorldPCSpecs pour les tests. Merci les gars!
Maths Physique et Fractales
Je viens de découvrir le site d’un fou furieux des maths/physique/programmation et toutes les choses qui vont avec. Les pages du site feraient presque mal au crane en les regardant. Le choix de des images de fond laisse vraiment à désirer. Mais c’est pas ça l’important dans ce site. C’est plutôt la quantité de projets fait avec des softs comme POV-Ray, Mathematica, mélangés avec des bout de code Java qui est impressionnante et ce dans les domaines de la simulation physique, des mathématiques, des fractales, de la programmation et d’autres que je passe. On dirait que le type a pris des produits hallucinogènes quand il a codé ses pages html.

C’est bourré de liens vers des whitpapers et autres ressouces (il y a d’ailleurs quelque part planqué un lien sur le démo de la galaxie spirale de Dr Goulu). Tout ça pour vous dire qu’il y surement quelques idées à reprendre pour faire des demos Demoniak3D…
Voilà les liens:
- www.bugman123.com/Physics/Physics.html
- www.bugman123.com/Fractals/Fractals.html
- www.bugman123.com/Math/Math.html
GPU Caps Viewer Validation Facility
In the version 1.4.0 of GPU Caps Viewer, I added a validation functionality:

Petit changement de Thème
Voilà j’ai encore changé de thème pour ce blog. Et oui que voulez vous, avec la quantité astronomique de thèmes disponibles, je pourrais en changer tous les jours. Ceci dit, pour ceux qui sont interessés, ce thème est dispo ici: Paalam.
Juste pour info, l’image d’entête est issue d’une petite démo 3d qui sera releasée prochainement.
Codage d’un Moteur de Ray-Tracing depuis Zéro en un Weekend
Voici un petit article sympa sur le codage d’un ray-traceur depuis zéro. Le code source du ray-traceur est fourni et est compréhensible. Donc si vous voulez vous plonger dans les entrailles d’un petit ray-traceur, c’est le moment.
L’article et le code source se trouvent ici: PixelMachine



