0 votes

Mise en œuvre d'un tampon z dans un rasterizer logiciel

Comme devoir à la maison, nous écrivons un logiciel de tramage. J'ai remarqué que ma mise en mémoire tampon z ne fonctionne pas aussi bien qu'elle le devrait, alors j'essaie de la déboguer en l'affichant à l'écran. (Le noir est proche, le blanc est éloigné).

Cependant, j'obtiens des valeurs particulières pour le z par vertex. C'est ce que j'utilise pour transformer les points :

float Camera::GetZToPoint(Vec3 a_Point)
{
    Vec3 camera_new = (m_MatRotation * a_Point) - m_Position;

    return (HALFSCREEN / tanf(_RadToDeg(60.f * 0.5f)) / camera_new.z);
}

m_MatRotation est une matrice 3x3. En la multipliant par un vecteur, on obtient un vecteur transformé.

J'obtiens des valeurs maximales et minimales comprises entre 0 et x, où x est un nombre apparemment aléatoire.

Est-ce que je fais bien cette transformation ? Si oui, comment puis-je normaliser mes valeurs Z pour qu'elles se situent entre deux points de référence ?

Merci d'avance.

4voto

Philippe Beaudoin Points 2230

Pour normaliser les valeurs Z, vous devez définir un plan de détourage proche et un plan de détourage éloigné. Ensuite, vous normalisez Z de sorte qu'il soit égal à 0 dans le plan proche et à 1 dans le plan éloigné.

Cependant, vous le feriez généralement après la projection. Il semble que votre dernière ligne soit celle où la projection a lieu.

Un certain nombre d'autres choses :

  • Vous calculez la multiplication matrice-vecteur complète mais ne gardez que le Z, c'est du gaspillage. Vous devriez envisager de transformer les points et de conserver toutes leurs coordonnées X, Y, Z ;
  • Vous recalculez tanf() à chaque sommet, mais sa constante ;
  • Je vous suggère d'utiliser une matrice de projection plutôt que le calcul du tanf ;
  • Commencez par une simple projection orthogonale, elle sera plus facile à déboguer.

1voto

Gabriel Points 858

En supposant que vous voulez connaître z à un vertez, qui serait a_Point :

Tout d'abord, vous devez effectuer la translation avant la rotation afin d'effectuer la rotation autour de votre caméra et non de l'origine de votre espace, qui peut se trouver ailleurs. Deuxièmement, camera_new n'est pas un nom très bien choisi, car il représente les coordonnées d'un_Point dans le nouveau référentiel défini par la position de votre caméra. A la place, faites ce qui suit :

Vec3 point_new = (m_MatRotation * (a_Point-m_Position));

Si cela ne fonctionne pas, vous devrez employer la manière forte en créant une véritable matrice de projection qui effectue la translation, la rotation et la projection en une seule multiplication. Voici quelques tutoriels qui m'ont beaucoup aidé à comprendre comment faire cela.

http://www.songho.ca/opengl/gl_projectionmatrix.html

codeguru.com/cpp/misc/misc/math/article.php/c10123/

Une fois que vous avez réussi à projeter des sommets sur l'écran d'une manière correcte du point de vue de la perspective, vous devrez trouver un moyen de remplir l'espace entre eux, et trouver, pour chaque pixel rempli, ce qu'est z. C'est une toute nouvelle histoire et l'article de Wikipedia sur le Texture mapping m'a aidé à le faire.

fr.wikipedia.org/wiki/Texture_mapping#Perspective_correctness

Désolé, je n'ai pas pu vous donner plus de liens, Stackoverflow ne m'a pas laissé faire parce que je suis un nouvel utilisateur...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X