texte initial |
correction |
date |
Hum... Intéressant!! Dommage que j'ai aucune connaissance en pour la prog C++, j'orai aimé t'aider. Bonne continuation quand même^^! |
Hum... Intéressant!! Dommage que j'ai aucune connaissance pour la prog C++, j'aurais aimé t'aider. Bonne continuation quand même^^!
|
12-09-2010 21:02:46 |
Salut TUpac, tu utilise quoi comme fonction ? et avec quels paramètres ? j'ai bien envi de tester je te promet rien mais sais t'on jamais. |
Salut TUpac, tu utilises quoi comme fonction ? et avec quels paramètres ? j'ai bien envie de tester je te promets rien mais sait-on jamais.
|
12-09-2010 21:02:04 |
Salut, je suis en train de faire un petit moteur 3d utilisant des VBO avec des Index partagés. Pour ceux qui ne conaissent pas, c'est une méthode pour limiter la quantité de données envoyées à la carte graphique. Mon soucis est que les coordonées de texture s'appliquent à un vertex et non un index. Du coup j'ai deux faces sur mon cube qui ne sont pas correctes car elle ont deux (1.0, 1.0) ou deux (0.0, 0.0). De plus, les autres faces (qui sont texturées) sont inversée une face sur deux. Une solution m'est venue imédiatement, c'est d'ajouter des vertex pour que les triangles ne partagent plus leurs vertex, mais ça augmente la quantité de données. Je file mes buffers pour mon cube déssiné avec des triangles :
Code:GLfloat CubePosData[] = { // Les vertex de 0 à 7 avec le logo des index
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f, // 7----3
// /| /|
1.0f,-1.0f, 1.0f, // 6-4--2-0
1.0f,-1.0f,-1.0f, // |/ |/
1.0f, 1.0f,-1.0f, // 5-----1
1.0f, 1.0f, 1.0f,};
GLubyte CubeIndexData[] = { // les index
1,0,2,
3,2,0,
5,6,4,
7,4,6,
7,3,4,
0,4,3,
6,1,2,
5,1,6,
3,7,2,
6,2,7,
1,5,0,
4,0,5,};
GLfloat CubeCoordsData[] = { // Coordonées dans le même ordre que les vertex
0.0f,0.0f, 1.0f,0.0f, 1.0f,1.0f, 0.0f,1.0f,
1.0f,0.0f, 0.0f,0.0f, 0.0f,1.0f, 1.0f,1.0f,
1.0f,0.0f, 0.0f,1.0f, 1.0f,0.0f, 1.0f,0.0f,
0.0f,0.0f, 0.0f,1.0f, 1.0f,1.0f, 1.0f,0.0f,}; Merci d'avance pour vos conseils. |
Salut, je suis en train de faire un petit moteur 3d utilisant des VBO avec des Index partagés. Pour ceux qui ne connaissent pas, c'est une méthode pour limiter la quantité de données envoyées à la carte graphique.
Mon soucis est que les coordonnées de texture s'appliquent à un vertex et non un index. Du coup j'ai deux faces sur mon cube qui ne sont pas correctes car elle ont deux (1.0, 1.0) ou deux (0.0, 0.0). De plus, les autres faces (qui sont texturées) sont inversée une face sur deux.
Une solution m'est venue immédiatement, c'est d'ajouter des vertex pour que les triangles ne partagent plus leurs vertex, mais ça augmente la quantité de données.
Je file mes buffers pour mon cube dessiné avec des triangles :
Code:GLfloat CubePosData[] = { // Les vertex de 0 à 7 avec le logo des index
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f, // 7----3
// /| /|
1.0f,-1.0f, 1.0f, // 6-4--2-0
1.0f,-1.0f,-1.0f, // |/ |/
1.0f, 1.0f,-1.0f, // 5-----1
1.0f, 1.0f, 1.0f,};
GLubyte CubeIndexData[] = { // les index
1,0,2,
3,2,0,
5,6,4,
7,4,6,
7,3,4,
0,4,3,
6,1,2,
5,1,6,
3,7,2,
6,2,7,
1,5,0,
4,0,5,};
GLfloat CubeCoordsData[] = { // Coordonnées dans le même ordre que les vertex
0.0f,0.0f, 1.0f,0.0f, 1.0f,1.0f, 0.0f,1.0f,
1.0f,0.0f, 0.0f,0.0f, 0.0f,1.0f, 1.0f,1.0f,
1.0f,0.0f, 0.0f,1.0f, 1.0f,0.0f, 1.0f,0.0f,
0.0f,0.0f, 0.0f,1.0f, 1.0f,1.0f, 1.0f,0.0f,}; Merci d'avance pour vos conseils.
|
12-09-2010 21:00:54 |
sa dépend si tu utilise la physique ou pas, et encore, pasque globalement si tu utilise un systeme de frame ton perso ne change pas de place enfin juste les polygone qui "bouge" perso c'est le plus simple pour commencer, après oui c'est sur il vaut mieux faire une détection du sols, tout dépend de ton niveaux |
ça dépend si tu utilises la physique ou pas, et encore, parce que globalement si tu utilises un système de frame ton perso ne change pas de place enfin juste les polygones qui "bougent"
perso c'est le plus simple pour commencer, après oui c'est sûr il vaut mieux faire une détection du sol, tout dépend de ton niveau
|
01-09-2010 21:11:07 |
il faut bien que tu utilise PressedDown mais remettre "sauter" a false seulement quand ton animation "sauter" est finie soit tu définie le temps qu'il mais, sait tu fix un numero de frame utiliser par tout tes perso, une sorte de norme, et quand l'animation arrive a tell frame, tu stop "sauter" |
il faut bien que tu utilises PressedDown mais remettre "sauter" à false seulement quand ton animation "sauter" est finie
soit tu définis le temps qu'il met, soit tu fixes un numéro de frame utilisé par tout tes perso, une sorte de norme, et quand l'animation arrive à telle frame, tu stop "sauter"
|
01-09-2010 21:10:23 |
bon commençons, le main .. oui c'est vrais c'est déjà un soucis pour les system portable, mais il suffie d'utiliser #if defined ...
en rêgle général on utilise sa ... avec des variante 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); 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 ...
Code:A return: 1 donc 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 |
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); 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 ...
donc 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
|
01-09-2010 21:08:20 |
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 expliquer 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 notion à savoir, mais n'est pas optimisé pour du temps reel. donc ça promet tout ça
ps: tu revient vendredi ? |
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 ?
|
01-09-2010 21:07:20 |
bon voila le minimal, sans les fonctions de rendue/raytracing et autre, j'ai pas euh le temps, et puis sa na plus d'intérais si je fait tout http://www.mediafire.com/?1fb1zqyyv520c1q
mais pour l'architecture sa devrait déjà t'aider je pensse, ceci dit ... comme tu le sais je suis sous linux, donc ... a toi de mettre les otions de compilation of et y a des commentaire un peut partout ... si sa peut t'aider ... j'en sais rien ..., tu a juste beusoin de rajouter sdl |
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
|
01-09-2010 21:06:29 |
bon alors pour les textures c'est pas très compliquer opengl fait casiment tout sa se fait en deux étapes: allocation mémoire en vram et création d'une id pour la texture utilisation de la texture a pellant l'id ...
bon je supose que tu sais déjà comme est les principe d'une texture ? enfin ... c'est pas compliquer tu crée un tableau "1D", ou tu y stocke les donner, de dimention width*height+1 pour se localiser, la position = x+height*y plus ou moin, faut prendre uassi en compte que tu utilise 3 ou 4 "channel" on va dire le format ( 8, 16, 24, 32 restpectivement, noir/blanc, noir/blanc/alpha, rgb oou yuv, argb ou rgba) donc ton tableau est égales a width*height*(format/8)+1, c'est toujours pareil pour se localiser (x+hieght*y)*(format/8), et pour retrouver les couleurs tu fait juste position+x ou x < format/8, pas trop compliquer jusque la ? c'est juste la partie software ( chargement ) après pour passer a opengl:
Code c++ : glEnable(GL_TEXTURE_2D); glGenTextures (1, & gl); glBindTexture (GL_TEXTURE_2D, gl); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 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); 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; }
supression de la texture:
Code c++ : !glIsTexture(gl)) ? glDeleteTextures(1,&gl) : void(); gl = 0;
et l'utilisation:
Code c++ : glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex->glTexture()); glDisable(GL_TEXTURE_2D);
le probleme c'est qu'il faut spésifier qu'elle endroi de la texture sera "plaquer" sur telle 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 la ?
sinon avec un peut de chance je ne suis pas dans le même internat que celui de l'ans dernier ou je ne captais pas la wifi, mais la rumeur cour que le pions qui avais la wifi les désactiver ... mais tkt c'est le premier truc que je teste
ps: désoler pour le "-1" je voulais faire une énumération mais je suis partie dans un discour oh et sa ne fait que 3semain que je bosse sous opengl donc je ne connais pas tout non plus ... (depuis le sleekthink)
edit: je poste le code demain ... et je feurais un effort, les sources en "français" + doc/commentaire ...
|
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); glBindTexture (GL_TEXTURE_2D, gl);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 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);
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(); gl = 0;
et l'utilisation:
Code c++ :
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex->glTexture());
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 ...
|
01-09-2010 21:05:15 |
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 utiliser directement les fenêtre d'un os, je suis toujours passé par des lib, donc faut que je trouve le temps de me documenter et après je rangerais 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 part 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 comprend 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'apprend 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 envi 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 d'aide est la bien venue , mais pas si ça te prend trop de temps, faut que tu profite des vacances sinon t'a pas internet à ton internât ? en tout cas merci pour les critiques, je peut pas tout corriger d'un coup(need doc), mais je prend bien en compte tout ce que tu dit
|
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 , mais pas si ça te prend trop de temps, faut que tu profites des vacances sinon t'as pas internet à ton internât ?
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
|
01-09-2010 21:00:07 |