28-08-2010 01:17:23
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Salut à tous, dans le but d'apprendre tout en s'amusant, je propose un projet communautaire, qui est un raytracer en temps réel.
j'ai vu un exemple ici: http://www.massal.net/article/raytrace/page1.html qui démontre qu'en théorie ce n'est pas trop compliqué ![]()
Mon idée c'est de faire un rendu en temps réel+ une animation).
Je propose qu'on utilise opengl, par contre je n'y connait pas grand chose ![]()
J'ai fait 2 classes pour séparer les calculs de lancé de rayons et le mode d'affichage qu'on pourra changer.
Code c++ :
class Ecran
{
protected:
int largeur, hauteur;
unsigned char* cellulesRVB;
Ecran(int Largeur, int Hauteur): hauteur(Hauteur),
largeur(Largeur),
cellulesRVB((unsigned char *) malloc( Largeur * Hauteur * 3 ))
{
memset(cellulesRVB, 255, Largeur * Hauteur * 3 );
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
void diffuser()
{
glDrawPixels( largeur, hauteur, GL_RGB, GL_UNSIGNED_BYTE, cellulesRVB);
}
};Voilà j'ai testé avec gldrawpixels, mais si vous connaissez mieux faites signe
Code c++ :
class lancerDeRayon : public Ecran
{
public:
lancerDeRayon(int Hauteur,int Largeur):Ecran(Hauteur,Largeur)
{
}
void trace()
{
int z=-1;
for (int y = 0; y <hauteur; ++y)
{
for (int x = 0; x < largeur; ++x)
{
float rouge = 0, vert = 0, bleu = 0;
/*
Calculs
*/
cellulesRVB[z++]=((unsigned char)min(rouge*255.0f,255.0f));
cellulesRVB[z++]=((unsigned char)min(vert*255.0f, 255.0f));
cellulesRVB[z++]=((unsigned char)min(bleu*255.0f, 255.0f));
}
}
diffuser();
}
};Que pensez-vous de l'organisation ? le but est de faire un truc simple et modulable, afin qu'on se concentre uniquement sur le lancé de rayons par la suite.
Hors ligne
28-08-2010 02:06:01
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
je sais pas quoi dire donc bon en vrac :
pour l'organisation il faut que tu fasses quelque chose comme moi ( vu que tu dois encore avoir les sources ...)
une classe device ( écran ) avec des attributs virtuels pour les fonctions, pour que ce soit facilement portable
une classe draw ( rendu ), pas besoin d'expliquer ... et les classes math ( vector/line/... )
code en anglais ![]()
cherche un autre tuto, puis si tu trouves vraiment pas, je t'en passerai
ne pas utiliser glDrawPixel mais passer par << glBegin(GL_POINTS); glVertex2f(x,y); glEnd(); >> ou dans le cas d'une line << glBegin(GL_LINES); glVertex2f(start.x,start.y); glVertex2f(end.x,end.y); glEnd(); >>
à quoi sert ta fonction trace ? une sorte de glClear ?
tu peux utiliser mes sources si ça te fait plaisir .... ( vu que je n'ai pas encore fait ça )
il me semble qu'opengl fournit une fonction à voir ...
projet communautaire ... ouais ... ça fait longtemps que j'y pense moi aussi, mais bon flemme et j'ai pas envie de me faire passer pour un idéaliste et voir le topic sombrer dans les entrailles du forum entre "c'est quoi opengl" et "kikoulool, slt tt l'mndeuh ..."
Hors ligne
28-08-2010 09:57:47
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Magun Ecris:
avec des attributs virtuels pour les fonctions, pour que ce soit facilement portable
oops, je me souviens plus à quoi ça sert
Magun Ecris:
code en anglais
Non ! tout mais pas ça SVP, bon à part si la majorité prend le dessus
Magun Ecris:
cherche un autre tuto
bein j'ai un peu cherché, et c'est celui qui m'a semblé le plus court, car le but initial est que tout le monde comprenne le procedé de raytracing, donc dit moi si tu connait d'autre tuto mais je cherche vraiment à avoir un code minimale pour commencer.
Magun Ecris:
ne pas utiliser glDrawPixel mais passer par << glBegin(GL_POINTS); glVertex2f(x,y); glEnd(); >> ou dans le cas d'une line << glBegin(GL_LINES); glVertex2f(start.x,start.y); glVertex2f(end.x,end.y); glEnd(); >>
Ok, je vais voir ça merci
Magun Ecris:
à quoi sert ta fonction trace ? une sorte de glClear ?
Mais non lol, enfin oui, mais non
Magun Ecris:
tu peux utiliser mes sources si ça te fait plaisir .... ( vu que je n'ai pas encore fait ça )
il me semble qu'opengl fournit une fonction à voir ..."
Magun Ecris:
projet communautaire ... ouais ... ça fait longtemps que j'y pense moi aussi, mais bon flemme et j'ai pas envie de me faire passer pour un idéaliste et voir le topic sombrer dans les entrailles du forum entre "c'est quoi opengl" et "kikoulool, slt tt l'mndeuh ..."
MDR, et bien oui je te comprend, j'ai moi même hésité, mais bon.... c'est sûr qu'on peut mal percevoir les choses, on verra, plus tard je vais mieu présenter la chose, sous la forme d'un tuto-tp mais avant je voudrai m'assurer d'employer les bonnes méthodes, donc déjà merci pour ton aide
Hors ligne
28-08-2010 13:36:21
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
j'ai pas trop le temps la vite fait 2/3 truc...
virtual permet de redéfinir les fonctions sur les classes/structures dérivées et du coup faire un appel du style mère->fonction(); qui fait une sorte de redirection automatique vers fils->fonction();
le raytracer doit être dérivé de draw, pas du device, ou le cas échéant être implanté dedans, en protected ![]()
s'il est implanté faire des fonctions style, enableRaytracerRendering, disable..., isEnabled... getRaytracer, setRaytracer ( au cas où l'utilisateur veut faire sont propre raytracer dérivé )
pour la fonction opengl je pensais à glRasterPos3f qui, si mes souvenirs sont bons, retourne une position 2d(screen) d'une position3d, ça peut aider
pour les sources je pensais que tu pouvais récupérer mes classes device et draw, et les simplifier quelque peu par exemple mais tu fais comme tu veux ![]()
Hors ligne
28-08-2010 23:11:43
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Magun Ecris:
j'ai pas trop le temps la vite fait 2/3 truc...
virtual permais de redefinir les fonctions sur les class/structure dériver et du coup faire un apelle du style mere->function(); qui fait une sorte de redirection automatique vers fils->function();
ok ,bon du coup j'en profite pour approfondir, je vais remanier tout ça
Magun Ecris:
le raytracer doit être dériver de draw, pas du device, où le cas échéant être implenter dedans, en protected
s'il est implenter faire des fonctions style, enableRaytracerRendering, disable..., isEnabled... getRaytracer, setRaytracer ( au cas ou l'utilisateur veut faire sont propre raytracer dériver )
tu veux dire déclarer l'"Ecran" dans le "Lancerderayon" ou l'inverse ?
Magun Ecris:
pour la fonction opengl je penssais a glRasterPos3f, si mais souvenir sont bon retourne une position 2d(screen) d'une position3d, sa peut aider
non je pense pas qu'on en ai besoin, mais c'est toujours bon à savoir
Magun Ecris:
pour les source je penssais que tu pouvais récupéré mais class device et draw, et de les simplifier quelque peut par exemple mais tu fait comme tu veut
Oui j'y jeterai un oeil
Hors ligne
29-08-2010 02:08:15
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
non déclarer le raytracer dans la classe de rendu, pas celui de l'écran
Hors ligne
29-08-2010 12:43:34
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
ha bein oui qu'est ce que je raconte moi ![]()
Je comptais faire simple mais en y réfléchissant un peu ça va pas le faire, dans l'exemple tout le code de raytracing est dans une même fonction, mais c'est pas flexible, y a la scène, les lumières, les matériels...... En fait je crois que c'est l'occasion de faire 2 tp en 1, raytracer+ l'organisation en C++, je pense que ça peut être que bénéfique pour les membres comme moi qui sont pas trop branchés POO.
Donc je sais pas trop comment procéder, je sais qu'irrlicht utilise des Interfaces comme tu le disais plus haut Magun, mais j'ai peur que ça alourdisse le code ?, enfin je sais pas combien ça va faire de fichiers tout ça, dis moi ce que t'en pense, mais il faudrait peut-être faire aussi des classes: Scene, Lumiere, Mesh.... afin que le moteur soit aisément améliorable, sans pour autant qu'il y ait trop de fichiers, j'ai d'ailleurs fait que des headers justement pour alléger le nombre de fichiers.
Comment verrais-tu la chose ?
Hors ligne
29-08-2010 13:32:55
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
ah ah ça parle architecture j'adore ![]()
bon perso je ferais le truc en une dizaine de fichiers, forcément dès que l'on commence à songer à faire un moteur ça devient un peu volumineux avec pas grand chose
pour que ça reste organisé, il faut forcément des dossiers ![]()
bon en restant dans un truc modeste ... ( tu fais comme tu veux pour les noms des fichiers, je fai ça vite fait )
device/device.*
device/device_sdl.* // dérivé du device
device/device_glut.* // dérivé du device
device/device_win.* // dérivé du device
device/device_w11.* // dérivé du device
node/scene.* // implémente un array<node*>
node/light.* // dérivé de node
node/node.* // base pour les nodes dérivés, ne contient que les données superflues ( texture, mesh, ... )
node/real.* // node de rendu de mesh ( standard)
node/skybox.* // dérivé de node
node/geometry.* // classe qui va générer les meshs
node/mesh.h // juste une structure avec des float* ( vertices, indices, TCoord et ... et normales )
render/draw.* // rendu graphique des éléments ( utilisé par les nodes )
render/raytracer.* // implémenté dans draw, au final je pense que c'est le mieux
redner/texture.* // chargement intégré pour pas se casser la tête ( tga c'est pas compliqué à charger )
math/vector2d.h
math/vector3d.h
math/line2d.h
math/line3d.h // utilisé par le raytracer
math/matrix4.h // utilisé dans le device pour modifier la matrice de perspective, enfin sauf si tu veux utiliser les fonctions standard, donc optionnel je pense
math/array.h // pas indispensable, mais dans la "scène" il te faudra utiliser des std::vector et pas des std::array, trop lentvite fait, je pense que c'est tout, mais tu verras vite fait que tu voudras rajouter des fonctionnalités ...
ps: ne faire que des headesr n'est pas la solution je dirais même que c'est super emmerdant après, à chaque modif ça va recompiler chaque fichier où ton header est inclus, directement ou non
edit: oublié la spec de real
Hors ligne
29-08-2010 18:30:46
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
ok, ce soir je vais faire des essais d'organisation, la principale difficulté pour moi c'est de faire communiquer les classes entre elles proprement. je manque cruellement d'experience.
Sinon j'ai fait vite fait une animation genre la lune en orbite autour de la terre, je pense que c'est l'idéal pour commencer, mais en vue orthographique c'est pas terrible; et je suis à 15% du cpu, donc je vois déjà 2 améliorations futur, qui sont la vue en perspective et le multthreading. mais d'abord faut que je fasse l'organisation ![]()
Hors ligne
30-08-2010 18:15:28
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
piouf, ça me prend plus de temps que prevu, j'espère présenter un essai cette nuit, j'ai bientot fini tout l'aspect "moteur" par contre pour le "device" j'ai pas encore commencé, en fait j'aurais besoin que tu me conseille comment faire des main() differents ? pour linux et tout, car j'ai fait "créer un nouveau projet opengl" avec codeblock et il me sort ça
Code c++ :
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
Donc je sais pas comment procédé ?
Hors ligne
31-08-2010 16:32:49
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
bon j'ai toujours pas fini, mais je montre quand même ou j'en suis ![]()
j'ai des problème avec les vector<>, je n'arrive pas à faire de pointeur sur un vector, et quand je l'utilise sans pointeur ça plombe les performances
donc j'ai laissé la méthode bidon pour l'instant.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | |
Hors ligne
31-08-2010 18:56:39
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
bon commençons, le main .. oui c'est vrai c'est déjà un soucis pour les systèmes portables, mais il suffit d'utiliser #if defined ...
en règle générale on utilise ça ... avec des variantes mais c'est le même principe
Code c++ :
#if (defined WIN32 || defined WIN64) && !defined SDL_DEVICE
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
#else
int main(int argc, char **argv)
#endif
après j'ai vu que tu initialises la fenêtre win32 dans la main, bon je pense que ce sera que temporaire mais go -> device spécifique ... enfin moi je vois ça comme ça
géométrie c'est pas trop mal, mais j'aurais pas tout à fait fait comme cela ... je suis pas sûr que t'aies bien compris, c'est peur-être ta vision des choses je n'ai rien contre
Code c++ :
struct Mesh
{
float *vertices;
float *indices;
float *TCoord;
float *normales;
};
class Geometry
{
public:
Mesh* makeSphere(flaot radiusX, float radiusY, unsigned int countX, unsigned int countY); // un peut compliqué peut-être pour un simple rendu "raytracing", mais si tu veux partir sur un moteur ...
Mesh* makeCube(Position3f);
};
pour le reste rien à dire mais
- 1: pourquoi il n'existe pas de Node ? qui relie Sphere, Lumiere, Camera ? tu n'aurais donc plus besoin de faire un array pour chaque type ....
example:
Code c++ :
class A
{
A(){}
virtual int function() { return 0; }
}
class B : public A
{
A(){}
virtual int function() { return 1; }
}
int main()
{
A *test = new B();
printf("A return: %d", test->fuction());
}
resulta ...
A return: 1donc si tu fais dériver Sphère, Lumière, Camera d'une classe plus "haute"
tu n'as besoin que d'un seul array pour stocker plusieurs types de "node" différents ...
ps 1: pas très pratique de coder sur le forum
ps 2: je pense que tu as encore quelque difficultés avec le poo, c'est pas facile pour beaucoup de personnes, mais qu'est-ce que c'est bien
donc si tu veux je peux te faire une base de ma base de "moteur", du moins pour le device et l'architecture ? mais ne tard pas trop, je reprends les cours jeudi et je serai interne toute la semaine
Hors ligne
31-08-2010 20:53:41
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Magun Ecris:
après j'ai vue que tu initialise la fenètre win32 dans la main, bon je pensse que se sera que temporaire mais go -> device spéciafique ... enfin moi je voie sa comme ça
oui je vais le faire, je n'ai jamais utilisé directement les fenêtres d'un os, je suis toujours passé par des lib, donc faut que je trouve le temps de me documenter et après je rangerai tous ça
Magun Ecris:
geometri c'est pas trop mal, mais j'aurais pas tout a fait, fait comme cela ... je suis pas sur que t'est bien comprit, c'est peur-être ta vision des chose je n'est rien contre
non c'est pas ma vision des choses(à vrai dire j'ai justement du mal à m'en faire une), j'ai juste fait au plus direct, et au plus simple, mais c'est clair que ça sera à faire par la suite, il faut dire aussi que je ne suis pas expérimenté en 3d non plus lol, donc il y a des truc que je ne comprends pas encore, là par exemple pour ajouter une texture au raytracer, je n'ai pour l'instant aucune idée de comment procéder, donc j'apprends au fur et à mesure aussi
Magun Ecris:
pour le reste rien a dire mais
- 1: pourquoi il n'existe pas de Node ? qui relie Sphere, Lumiere, Camera ? tu n'aurais donc plus beusoin de faire un array pour chaque type ....
j'ai envie de dire +1, faut que je fasse ça....
Magun Ecris:
ps 2: je pensse que tu a encore quelque dificulter avec le poo, c'est pas facil pour beaucoup de personne, mais quesque c'est bien
+1, c'est pas facile mais c'est pas difficile non plus, je dirai que ça peut être complexe
Magun Ecris:
donc si tu veut je peut te faire une base de ma base de "moteur", du moin pour le device et l'architecture ? mais ne tard pas trop, je reprend les cours jeudi et je serait interne toute la semaine
bein je veux bien, tout aide est la bienvenue
en tout cas merci pour les critiques, je peux pas tout corriger d'un coup(need doc), mais je prends bien en compte tout ce que tu dis
Hors ligne
31-08-2010 21:17:26
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
bon alors pour les textures c'est pas très compliqué opengl fait quasiment tout
ça se fait en deux étapes:
allocation mémoire en vram et création d'une id pour la texture
utilisation de la texture appelant l'id ...
bon je suppose que tu sais déjà comme est les principe d'une texture ? enfin ... c'est pas compliquer tu crées un tableau "1D", où tu stockes les données, de dimension width*height+1
pour se localiser, la position = x+height*y plus ou moins, faut prendre aussi en compte que tu utilises 3 ou 4 "channel" on va dire le format ( 8, 16, 24, 32 respectivement, noir/blanc, noir/blanc/alpha, rgb oou yuv, argb ou rgba) donc ton tableau est égal à width*height*(format/8)+1, c'est toujours pareil pour se localiser (x+hieght*y)*(format/8), et pour retrouver les couleurs tu fais juste position+x ou x < format/8, pas trop compliqué jusque là ? ![]()
c'est juste la partie software ( chargement ) après pour passer à opengl:
Code c++ :
glEnable(GL_TEXTURE_2D);
glGenTextures (1, & gl); // gl est de type GLuint soit l'id de la texture
glBindTexture (GL_TEXTURE_2D, gl);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // option a la screunieugnieuh ça marche bien dans mes exemples donc ...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glDisable(GL_TEXTURE_2D);
//spécification suivant le format
switch(format)
{
case TXFMT_LUMINANCE:
glTexImage2D(GL_TEXTURE_2D, 0, fmt, original.width, original.height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer);
break;
case TXFMT_LUMINANCE_ALPHA:
glTexImage2D(GL_TEXTURE_2D, 0, fmt, original.width, original.height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, buffer);
break;
case TXFMT_RGB:
glTexImage2D(GL_TEXTURE_2D, 0, fmt, original.width, original.height, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);
break;
case TXFMT_RGBA:
glTexImage2D(GL_TEXTURE_2D, 0, fmt, original.width, original.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
break;
}
suppression de la texture:
Code c++ :
!glIsTexture(gl)) ? glDeleteTextures(1,&gl) : void(); // plus rapide qu'un if, il paraît que ça utilise des instructions asm ...
gl = 0;
et l'utilisation:
Code c++ :
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex->glTexture());
//rendue de l'object
glDisable(GL_TEXTURE_2D);
le problème c'est qu'il faut spécifier quel endroit de la texture sera "plaqué" sur tel polygone, pour ça on utilise << glTexCoord3i(0,1,0); >> ou 0 c'est le bord supérieur haut ou gauche et 1 le bord inférieur ou droit
c'est bon j'y suis pas aller trop fort jusque là ?
sinon avec un peu de chance je ne suis pas dans le même internat que celui de l'an dernier où je ne captais pas la wifi, mais la rumeur court que le pions qui avaient la wifi la désactivaient ... mais t'inquiète c'est le premier truc que je teste
ps: désolé pour le "-1" je voulais faire une énumération mais je suis partie dans un discours
oh et ça ne fait que 3 semaines que je bosse sous opengl donc je ne connais pas tout non plus ... (depuis le sleekthink)
edit: je poste le code demain ... et je ferai un effort, les sources en "français" + doc/commentaire ...
Hors ligne
01-09-2010 02:28:41
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
bon voilà le minimal, sans les fonctions de rendu/raytracing et autre, j'ai pas euh le temps, et puis ça n'a plus d'intérêt si je fais tout ![]()
http://www.mediafire.com/?1fb1zqyyv520c1q
mais pour l'architecture ça devrait déjà t'aider je pense, ceci dit ... comme tu le sais je suis sous linux, donc ... à toi de mettre les options de compilation ![]()
of et y a des commentaires un peut partout ... si ça peut t'aider ... j'en sais rien ..., tu as juste besoin de rajouter sdl
Hors ligne
01-09-2010 16:58:22
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Merci pour l'exemple de hiérarchie
je devrais arriver à faire quelque chose de "propre" d'ici quelque jours.
Sinon pour les textures, j'suis un fou moi j'avais pas vu que c'était expliqué dans le tuto http://www.massal.net/article/raytrace/page3.html , en fait le tuto est en 6 parties, et il décrit les principales notions à savoir, mais n'est pas optimisé pour du temps réel. donc ça promet tout ça ![]()
ps: tu reviens vendredi ?
Hors ligne
02-09-2010 01:19:03
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
je me souvient que tu parlais de multy-threading ? je te préviens a l'avence tu va avoir des soucis ![]()
opengl n'est pas encore "totatlement orienter thread", ou plutot il ne les pas du tout, seulement en passant par opencl, qui nécéssite une carte graphique ou cpu(avec un fpu rapide+sse3 ou sse4) récent donc ...
et des driver a jour ( nvidia 186.xx il me semble, ou ati catalyst 10.7 + ati stream )
sinon changement de programme la rentré séfectue vendredie, histoire de faire chier le peuple ...
140 borne dans la jounée ... pas très écolo tout sa ... et biensur pas de bus ![]()
Hors ligne
02-09-2010 02:04:18
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Magun Ecris:
opengl n'est pas encore "totatlement orienter thread", ou plutot il ne les pas du tout
Mais en fait si j'utilise opengl, c'est juste pour afficher le tableau de pixels, rien de plus
Hors ligne
06-09-2010 16:20:20
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Coucou,
je suis en train de faire comme tu dit Magun mais je rencontre de serieux problème de performances, cela ne viens pas de ton code puisque j'ai regardé dans irrlicht est c'est là même.
outre le problème de lenteur des <vector>, je rencontre maintenant un problème de lenteur sur la structure vecteur3, voici comment j'ai procédé:
Code c++ :
template<typename T> struct vecteur3
{
T X, Y, Z;
vecteur3(T x=0, T y=0, T z=0) : X(x), Y(y), Z(z) {}
vecteur3<T> operator + (const vecteur3<T>& v2){ return vecteur3<T>(X + v2.X, Y + v2.Y, Z + v2.Z);}
vecteur3<T> operator - (const vecteur3<T>& v2){ return vecteur3<T>(X - v2.X, Y - v2.Y, Z - v2.Z);}
vecteur3<T> operator * (const float& c) { return vecteur3<T>(X * c, Y * c, Z * c );}
};
typedef vecteur3<float> vecteur3f;
Le problème se situe dans les 'return' des operator qui sont beaucoup plus lent(+10ms par frame) que ça:
Code c++ :
struct vecteur3f
{
float X, Y, Z;
};
vecteur3f operator + (const vecteur3f& v1, const vecteur3f& v2){ return (vecteur3f){v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z};}
vecteur3f operator - (const vecteur3f& v1, const vecteur3f& v2){ return (vecteur3f){v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z};}
vecteur3f operator * (const vecteur3f& v1, const float& c) { return (vecteur3f){v1.X * c, v1.Y * c, v1.Z * c };}
Donc je sais pas comment procéder pour faire un return de ce type mais avec l'organisation précédente ?, en tout cas ce qui est sûre c'est que le code d'irrlicht à encore une bonne marge d'optimisation.
EDIT: c'est bon j'ai trouvé
Code c++ :
template<typename T> struct vecteur3
{
T X, Y, Z;
vecteur3<T> operator + (const vecteur3<T>& v2){ return (vecteur3<T>){X + v2.X, Y + v2.Y, Z + v2.Z};}
vecteur3<T> operator - (const vecteur3<T>& v2){ return (vecteur3<T>){X - v2.X, Y - v2.Y, Z - v2.Z};}
vecteur3<T> operator * (const float& c) { return (vecteur3<T>){X * c, Y * c, Z * c };}
};
typedef vecteur3<float> vecteur3f;
vecteur3f Vecteur3f(float x, float y, float z) {return (vecteur3f){x,y,z};}
C'est un peu moins propre mais beaucoup plus performant !
Hors ligne
10-09-2010 13:37:42
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 86.221.127.154
- Courriel Site web
bon je pense qu'il est temps que je jette un coup d'oeil à ce tuto cela ? ![]()
histoire de voir l'avancement ou ce qui pourrait être changé/amélioré ... ![]()
Hors ligne
10-09-2010 14:38:56
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
attends tout à l'heure je te montre où j'en suis..... j'ai toujours pas fini mais j'ai beaucoup gagné en performances....
edit: voilà il y a des fichiers où c'est encore le bordel notamment win.h c'est le bronx lol.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | |
Hors ligne
10-09-2010 20:31:32
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
c'est pas mal, je suis pas mécontent, je vois que mon exemple a servi un peu
quelques remarques si ça peut t'aider plus tard ![]()
this-> pas obligatoire en règle générale sauf rare cas ( exemple la classe a une variable Blabla et que la fonction a un paramètre qui s'appelle aussi Blabla, mais ici rouge et Rouge il n'y a pas de soucis )
tu n'es pas obligé de spécifier un nom de variable dans les déclarations de variable ... mais c'est juste histoire de coder plus vite
dans materiaux tu pourrais utiliser un vecteur3<unsigned char> pour les couleurs, mais bon c'est un détail ![]()
fais attention à <<#define main Moteur>> je ne sais pas si c'est voulu mais concrètement le define va remplacer tout les main par Moteur, où qu'il soit, surtout qu'il est dans un headler sa implique que les fichiers qui l'incluent sont affectés ... ![]()
et puis peut-être pas assez de guard
question: tu as un rendu graphique ? pour l'histoire des vecteur3, désolé j'étais pas là, mais ça a eu peut être du bon ? ^^
Hors ligne
10-09-2010 21:54:33
- TUpac
- Membres

- Date d'inscription:
- Messages: 387
- IP: 88.168.3.38
- Courriel
C'est génial tes onglets avec ton code !! tu files les balises BB stp ? ![]()
Et sinon c'est ça que t'appelles du bordel ?!
Attends de recevoir mon mail ![]()
"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."
Hors ligne
11-09-2010 14:05:23
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
TUpac Ecris:
C'est génial tes onglets avec ton code !! tu file les balises BB stp ?
C'est ecrit dans le fichier d'aide
@Magun, ouai t'a vu j'ai honoré ton exemple
le this je les mis juste pour la lisibilité, c'est clair que c'est pas obligé,
pour le define moteur, ouai t'a raison faut pas le placé n'importe ou, il faudrait mieu l'appelé MainWIN par exemple, mais avous que l'astuce du fake main est pas mal
sinon c'est quoi c'est guard ? je connais pas.
you said: tu a un rendue graphique?
pourquoi toi non ? ou est le problème ? ha oui faut faire linux.h maintenant.....
Hors ligne
11-09-2010 17:12:07
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
guard:
Code c++ :
#ifndef HEADLER_NAME
#define HEADLER_NAME
//code
#endif
surtout utilisé pour éviter les inclusions multiples
pour le rendu, d'une part oui linux, d'autre part, créer un projet, faire les fichier, recopier les codes, c'est long ...
Hors ligne



