30

GUNNM (./27) :
Comment en utilisant un points par triangle sauf pour le premier, tu obtiens 2 *x triangle par ligne? Tu dois faire erreur. J'en compte x-1 par ligne. C'est pour ça que je ne comprend pas pourquoi la fonction de aze me donne autand de points... je devrais en avoir +/- 480*640 ? Non?
C'est bien environ un point par triangle dont tu as besoin. Tu te trompes juste sur le nombre de triangles smile

En fait, avec 640 * 480 points, tu formes une grille de 639 * 479 cases et chaque case est découpée en deux triangles (regarde le schéma que tu montres en ./1). Il te faut donc 2 * 639 * 479 + 2 (deux premiers points) + 478 (doubles points de changement de ligne) = 2 * 640 * 479 + 1 points pour former tes triangles.

Cross...
avatar

31

Pour info, ça a fonctionné. Il fallait que je supprime les triangles dont l'un vertex était aberrant, plutôt que de ne supprimer que le vertex.
Merci à vous.

Mais ça rame méchamment. Du type 1 image toutes les 10 secondes. (sur un I7 920 + Gtx275 : ça ne me semble pas normal)
Je pense que la routine d'affichage est foireuse, mais ce n'est pas moi qui l'ai écrit. Je vais donc galérer avant de trouver d'ou ça viens.

Il me reste une question : A l'affichage, le triangle_strip n'est pas parfait, à moins d'afficher en transparent les triangles aberrant comme vous me l'avez suggérer. Comme je ne sais pas comment afficher en transparent, j'ai tenté le triangle list.
J’obtiens 6 fois plus de vertex que de pixels. C'est normal? (Je n'ai pas l'esprit logique pour ce genre de calculs comme vous avez pus le voir, alors je préfère demander)
Résultat, le rendu est excellent, mais ça rame encore plus. Je vais tenter de passer par des tableau d'indices, mais puisque j'afficherais le même nombre de triangles, vais-je y gagner beaucoup?

32

Un triangle = 3 angles
Un triangle = 3 côtés
Un triangle = 3 sommets (points)

N*1 triangle = N*3 points

Triangle List: N*1 triangle = N*3 points
Triangle Strip: N*1 triangle = N+2 points
C'est pourtant simple, non ? tongue

Le fait que ce soit lent, à moi, me semble normal. (Car tu synchronises (trop) souvent le CPU et le GPU et que tu n'utilise à priori pas les fonctionnalités de parallélisation là où ça serait possible) Mais ça ne devrait quand même pas l'être autant.
La quantité de données que tu as à transférer vers la carte graphique (3,5 ou 8,2 Mo au minimum, selon l'utilisation de strips ou de listes) ne me semble pas suffisante pour provoquer une dégradation violente des performances (compte tenu du débit théorique du PCI Express 2.0…), c'est dont certainement la manière dont tu le fais (ou bien la manière dont tu t'en sers) qui est en cause.
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

33

pour rendre les points aberrants transparents, il faut que tu ajoutes une couleur à chaque vertex au moment où tu ajoutes le point dans le triangle strip.
si le point est normal, ajoute (1.0, 1.0, 1.0, 1.0) (blanc avec alpha=1), si le point est aberrant, ajoute (1.0, 1.0, 1.0, 0.0) (blanc avec alpha=0)
ensuite il faut que dans ton matériau, tu multiplies la couleur et l'alpha de la texture par la couleur des vertex et tu affiches le tout en alpha blending

ça c'est pour la théorie, j'ai jamais fait d'opengl donc je ne sais pas trop comment faut faire ça. Mais je suppose que si tu ajoutes tes points avec un genre glPoint(), tu dois pouvoir aussi ajouter une couleur avec un glColor()
avatar

34

En fait je viens de réaliser, 1 image / 10 sec c'est typiquement ce qui devrait se produire avec un rendu logiciel. Tu as peut-être utilisé une vilaine API pas belle, ou alors tu n'as pas de drivers OpenGL potables…
aze > Tout (mais alors absolument tout ^^) peut se faire en shaders si besoin… (C'est pas vraiment utile de rajouter la couleur si la seule information dont tu as besoin se trouve déjà dans les coordonnées des point…)
Et si tu as regardé le bout de code, il semble qu'il utilise un vertex buffer (via une classe qu'il n'a sans doute pas créée lui-même… Et la façon dont c'est fait ne me semble pas optimale tongue) donc pas de glPoint() & co. (De toutes façons c'est mal… la plupart du temps tongue)
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

35

cross
OK, merci.
En fait je m'était fait la même réflexion en voyant que j'avais RGB et A comme membre de la classe vertex.

./32 > J'ai bien compris qu'en triangle liste j'ai 3 points supplémentaires, contre 1 point en triangle strip, pour chaque nouveaux triangles.
Mais combien j'ai de triangles en mode triangle list avec 640*480 vertex ? L réponse n'est pas 640*480 *3 puisque je peux utiliser plusieurs fois le même point.

36

GoldenCrystal (./34) :
En fait je viens de réaliser, 1 image / 10 sec c'est typiquement ce qui devrait se produire avec un rendu logiciel.
Ah.. pas bête. Je vais regarder ça. Merci.

37

GC> oui, c'est vrai, mais autant y aller mollo et faire avec code actuel grin
Quand tu dis que c'est mal, tu parles du mode immédiat ou de mettre des infos de couleur dans les vertex ?
avatar

38

Le premier ^^
En fait y'a des cas où ça peut être utile de ne pas stocker tes données en mémoire vidéo (typiquement dessiner 2-3 rectangles texturés, ou balancer des données qui varient à chaque image comme c'est le cas ici (mais ici y'a trop de points pour que ce soit un tant soit peu intéressant)) mais la façon dont OpenGL gère ça (avec 70 appels de fonction foutus en vrac) est totalement débile… Je pense que le DrawPrimitiveUP de DirectX est largement mieux fichu, tant au niveau utilisation qu'au niveau performances…
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

39

je suis d'accord, le mode immédiat n'est pas fait pour afficher des meshs un minimum sérieux
par contre je ne trouve pas ça vraiment mal fichu. Dans Ogre (oui je sais grin) tu as une classe qui permet de créer et de remplir facilement un vertex buffer et qui utilise des méthodes imitant le mode immédiat d'opengl. C'est carrément plus pratique que d'avoir à écrire directement dans un buffer à coup de pointeur.
avatar

40

Ben le truc c'est qu'un vertex buffer (un vrai) n'a pas de format défini. Alors tu peux pas vraiment définir de méthodes précises adaptées à tous les cas.
La seule constante c'est les coordonnées du point (et encore…), mais tu peux utiliser le reste pour mettre ce que tu veux et dans le format que tu veux (dans la limite de ce que le matériel supporte) alors hmm…
(OpenGL, lui il ne connait que les trucs lié à ce que certains appellent le Fixed function Pipeline… Mais ce truc est totalement obsolète, et plus du tout en application de nos jours (émulé par le driver))
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

41

C'est le mode debug qui faisait ramer. En release c'est presque fluide.
Je n'ai pas trouvé comment forcer l’accélération matérielle avec OpenGL, j'ai l'impression qu'il n'y a pas de fonction pour ça, comme dans D3D.

42

GC> nan mais évidemment que tu peux pas tout faire avec. mais pour construire un mesh à la main, dans 99% des cas, des fonctions copiant openGL et le mode immédiat seront plus pratiques que de devoir travailler sur un buffer à coup de pointeur. Encore une fois, je ne répondais que sur le fait qu'il est mal fichu niveau utilisation.

(quel rapport avec le FFP ? et si tu veux te faire un pipeline 100% shaders, tu peux le faire en opengl, non ?)
avatar

43

Ben ouais mais les vestiges obsolètes du FFP que sont les glMachinTruc() (Vertex, Normal, Color, etc.) vont pas t'être très utile pour avoir un format de vertex personnalisé, non ?
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes