[GLSL] Calcul de la position écran dans un vertex shader
Salut tout le monde,
Je suis en train de bosser sur une simulation de fluide où j'ai besoin de faire un texture lookup dans un vertex shader. Pour cela j'ai besoin de calculer la position écran du point que je dessine à partir de ses coordonnées 3D. Voilà ce que je fais (modelview est à l'identité donc je ne m'en sers pas) :
Code:
1 2 3 4 5 6
|
vec4 Position = gl_ProjectionMatrix * vec4(VertexPosition, 1.0);
gl_Position = Position;
Position.xy = (Position.xy / Position.w) * 0.5 + 0.5;
...
vec4 color = texture(mySampler, Position.xy); |
Ce qui marche parfaitement sur une carte ATI (HD 5870) mais ne fonctionne pas sur une NVIDIA (GTX 580), les drivers ont bien été mis à jours.
Description de l'erreur : Les shaders compilent, mais apparemment il y a une erreur de précision sur mon calcul avec la carte nvidia. En effet, pour pouvoir débugger je coloris mes points en vert quand la position calculé correspond à la position réel (celle rasterizé par la carte graphique) et sinon en rouge. Pour avoir cette info j'effectue une premiere passe ou je dessine mes points dans une texture et dans ma 2° passe ou j'essaye de calculer à la main la position écran de mon point je fais un lookup sur la texture de la passe précédente et je vérifie qu'elle contient bien mon point.
Sur une carte ATI dans tous les cas les points sont verts.
Sur une carte NVIDIA ils sont généralement verts, mais quelques fois une ligne ou une colonne devient rouge (je dessine une grille de points).
Je m'en rend compte en positionnant les points à un certain endroit ou en les déplaçant très lentement.
Je pense que le problème survient quand les points approchent la limite entre deux pixels et qu'une erreur de précision survient dans mon calcul du point par rapport à celui qui est fait par la carte graphique.
Sur un autre forum on m'a orienté vers le mot clé "precise" qui permet d'empêcher certaines optimisations sur les calculs flottant surtout sur les cartes nvidia mais cela n'a pas fonctionné.
Quelqu'un a-t-il une idée à mon insoluble problème :D
Merci