begin process at 2012 05 27 18:47:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > MOTEUR 3D DIMETRIQUE

MOTEUR 3D DIMETRIQUE


 Information sur la source

Note :
Aucune note
Catégorie :OpenGL Classé sous :3d, opengl, png, terrain, matrix Niveau :Initié Date de création :09/07/2006 Date de mise à jour :11/07/2006 13:13:53 Vu / téléchargé :9 917 / 612

Auteur : Mattpbem

Ecrire un message privé
Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
c'est une application qui affiche un terrain en projection orthogonale dimetrique. une projection dimétrique est une projection gardant les projections de 2 axes (une projection isometrique garde les proportions des 3 axes) . cette projection est faite à l'aide d'une matrice de transformation Opengl

la projection permet de changer l'inclinaison du terrain et de le faire tourner mais je n'ai pas implementer de depth sorting et en regardant le terrain de l'arriere on voit les faces avant .

->click gauche sur l'eau : crée des vagues
-> drag click droit : scroll (translate) le terrain
-> drag click milieu : change l'echelle (scale) le terrain
-> drag click gauche+droite : change l'inclinaison et la rotation du terrain

le programme tourne à 75fps sur mon ordinateur (Geforce 2 MX T_T): je pense qu'il n'est limité que par le nombre de polygones à affiché (128*128)

l'executable est trop gros pour le zip
mais vous pouvez le trouver sur http://matt2000.free.fr/release.rar ainsi que des textures non compressés

Source

  • void CTerrainNode::Draw() {
  • GLdouble model[16], proj[4][4];
  • GLint view[4];
  • glGetDoublev(GL_PROJECTION_MATRIX, &proj[0][0]);
  • glGetIntegerv(GL_VIEWPORT, &view[0]);
  • double x,y,z;
  • char tmp[32];
  • unsigned char white[] = { 255,255,255 },height;
  • short mx = WindowMaker->mouse.x;
  • short my = WindowMaker->mouse.y;
  • /**
  • Projection setting
  • **/
  • glPushMatrix();
  • float matrix[16]= { sqrt(2)*0.5 , -sqrt(2)*0.5*sin((float)(256-View->camera.ry)/256) , 0 , 0,
  • -sqrt(2)*0.5 , -sqrt(2)*0.5*sin((float)(256-View->camera.ry)/256) , 0 , 0,
  • 0 , cos((256-View->camera.ry)/256) , 1 , 0,
  • View->camera.x , View->camera.y , 0 , 1 };
  • glLoadMatrixf(matrix);
  • glRotatef((-View->camera.rx+128)/2.8,0,0,1);
  • glScalef((float)View->camera.zoom/8,(float)View->camera.zoom/8,(float)View->camera.zoom/16);
  • /**
  • Terrain rendering
  • **/
  • glEnable(GL_DEPTH_TEST);
  • glEnable(GL_TEXTURE_2D);
  • glBindTexture( GL_TEXTURE_2D, tilemap->id );
  • for(int i=0;i<heightmap->height-1;i++) {
  • for(int j=0;j<heightmap->width-1;j++) {
  • glBegin(GL_QUADS);
  • glTexCoord2f((float)i/heightmap->width,(float)j/heightmap->height);
  • glVertex3f(i ,j ,heightmap->get(i,j,0));
  • glTexCoord2f((float)(i+1)/heightmap->width,(float)(j)/heightmap->height);
  • glVertex3f(i+1 ,j ,heightmap->get(i+1,j,0));
  • glTexCoord2f((float)(i+1)/heightmap->width,(float)(j+1)/heightmap->height);
  • glVertex3f(i+1 ,j+1 ,heightmap->get(i+1,j+1,0));
  • glTexCoord2f((float)(i)/heightmap->width,(float)(j+1)/heightmap->height);
  • glVertex3f(i ,j+1 ,heightmap->get(i,j+1,0));
  • glEnd();
  • }
  • }
  • glDisable(GL_DEPTH_TEST);
  • glEnable(GL_BLEND);
  • glDisable(GL_TEXTURE_2D);
  • /**
  • retrieve the mouse position on the terrain
  • **/
  • glGetDoublev(GL_MODELVIEW_MATRIX, &model[0]);
  • double right[3];
  • right[0] = model[0];
  • right[1] = model[4];
  • right[2] = model[8];
  • float w;
  • glReadPixels(mx,768-my,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&w); //read pixel (GL_FLOAT) return a float not a double
  • z = w;
  • gluUnProject( mx,768-my,z,&model[0], &proj[0][0], &view[0], &x, &y,&z);
  • ix = x+0;
  • iy = y+0;
  • if(ix>127) ix = 127; else if(ix<0) ix = 0;
  • if(iy>127) iy = 127; else if(iy<0) iy = 0;
  • glColor4ub(255,0,0,128);
  • glBegin(GL_QUADS);
  • glVertex3f(ix ,iy ,heightmap->get(ix,iy,0));
  • glVertex3f(ix+1 ,iy ,heightmap->get(ix+1,iy,0));
  • glVertex3f(ix+1 ,iy+1 ,heightmap->get(ix+1,iy+1,0));
  • glVertex3f(ix ,iy+1 ,heightmap->get(ix,iy+1,0));
  • glEnd();
  • /**
  • Object (tree,building) rendering using point sprite extension
  • **/
  • glPointSize((float)View->camera.zoom/4);
  • glTexEnvf (GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
  • glEnable (GL_POINT_SPRITE);
  • glEnable(GL_TEXTURE_2D);
  • glColor3ub(255,255,255);
  • for(int i=0;i<heightmap->height-1;i++) {
  • for(int j=0;j<heightmap->width-1;j++) {
  • if( objectmap->get(i,j,0) && objectmap->get(i,j,0) <= nofObject ) {
  • glBindTexture( GL_TEXTURE_2D, object [ objectmap->get(i,j,0) ].id );
  • glBegin(GL_POINTS);
  • glVertex3f(i+0.5,j+0.5,heightmap->get(i,j,0));
  • glEnd();
  • }
  • }
  • }
  • glPointSize(16);
  • glDisable (GL_POINT_SPRITE);
  • glDisable(GL_TEXTURE_2D);
  • glEnable(GL_DEPTH_TEST);
  • glColor4ub(96,192,255,64);
  • for(int i=0;i<heightmap->height-1;i++) {
  • for(int j=0;j<heightmap->width-1;j++) {
  • if(heightmap->get(i,j,0) < 64) {
  • glBegin(GL_QUADS);
  • //glTexCoord2f((float)i/heightmap->width,(float)j/heightmap->height);
  • glVertex3f(i ,j ,64+((float)wavemap[(i+j*128)*2+swap]/32));
  • //glTexCoord2f((float)(i+1)/heightmap->width,(float)(j)/heightmap->height);
  • glVertex3f(i-1 ,j ,64+((float)wavemap[(i-1+j*128)*2+swap]/32));
  • //glTexCoord2f((float)(i+1)/heightmap->width,(float)(j+1)/heightmap->height);
  • glVertex3f(i-1 ,j-1 ,64+((float)wavemap[(i-1+(j-1)*128)*2+swap]/32));
  • //glTexCoord2f((float)(i)/heightmap->width,(float)(j+1)/heightmap->height);
  • glVertex3f(i ,j-1 ,64+((float)wavemap[(i+(j-1)*128)*2+swap]/32));
  • glEnd();
  • }
  • }
  • }
  • glDisable(GL_DEPTH_TEST);
  • sprintf(tmp," x %i y %i z %0.0f",ix,iy,z);
  • gl.DrawText2D(128,128,white,2.0f,0,tmp);
  • glPopMatrix();
void CTerrainNode::Draw() {

GLdouble model[16], proj[4][4];
GLint view[4];
glGetDoublev(GL_PROJECTION_MATRIX, &proj[0][0]);
glGetIntegerv(GL_VIEWPORT, &view[0]);
double x,y,z;
char tmp[32];
unsigned char white[] = { 255,255,255 },height;
short mx = WindowMaker->mouse.x;
short my = WindowMaker->mouse.y;

/**
Projection setting
**/
glPushMatrix();
float matrix[16]= { sqrt(2)*0.5    , -sqrt(2)*0.5*sin((float)(256-View->camera.ry)/256) , 0 , 0,
                    -sqrt(2)*0.5   , -sqrt(2)*0.5*sin((float)(256-View->camera.ry)/256) , 0 , 0,
                    0              , cos((256-View->camera.ry)/256)              , 1 , 0,
                    View->camera.x , View->camera.y  , 0 , 1  };
            glLoadMatrixf(matrix);
            glRotatef((-View->camera.rx+128)/2.8,0,0,1);
            glScalef((float)View->camera.zoom/8,(float)View->camera.zoom/8,(float)View->camera.zoom/16);

/**
Terrain rendering
**/
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glBindTexture( GL_TEXTURE_2D, tilemap->id );

    for(int i=0;i<heightmap->height-1;i++) {
        for(int j=0;j<heightmap->width-1;j++) {

            glBegin(GL_QUADS);
                glTexCoord2f((float)i/heightmap->width,(float)j/heightmap->height);
                glVertex3f(i   ,j   ,heightmap->get(i,j,0));
                glTexCoord2f((float)(i+1)/heightmap->width,(float)(j)/heightmap->height);
                glVertex3f(i+1 ,j   ,heightmap->get(i+1,j,0));
                glTexCoord2f((float)(i+1)/heightmap->width,(float)(j+1)/heightmap->height);
                glVertex3f(i+1 ,j+1 ,heightmap->get(i+1,j+1,0));
                glTexCoord2f((float)(i)/heightmap->width,(float)(j+1)/heightmap->height);
                glVertex3f(i   ,j+1 ,heightmap->get(i,j+1,0));
            glEnd();
        }
    }

glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

/**
retrieve the mouse position on the terrain
**/
glGetDoublev(GL_MODELVIEW_MATRIX, &model[0]);
double right[3];
right[0] = model[0];
right[1] = model[4];
right[2] = model[8];
float w;
glReadPixels(mx,768-my,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&w); //read pixel (GL_FLOAT) return a float not a double
z = w;
gluUnProject( mx,768-my,z,&model[0], &proj[0][0], &view[0], &x, &y,&z);
ix = x+0;
iy = y+0;
if(ix>127) ix = 127; else if(ix<0) ix = 0;
if(iy>127) iy = 127; else if(iy<0) iy = 0;

            glColor4ub(255,0,0,128);

            glBegin(GL_QUADS);
                glVertex3f(ix   ,iy   ,heightmap->get(ix,iy,0));
                glVertex3f(ix+1 ,iy   ,heightmap->get(ix+1,iy,0));
                glVertex3f(ix+1 ,iy+1 ,heightmap->get(ix+1,iy+1,0));
                glVertex3f(ix   ,iy+1 ,heightmap->get(ix,iy+1,0));
            glEnd();

/**
Object (tree,building) rendering using point sprite extension
**/
glPointSize((float)View->camera.zoom/4);
glTexEnvf (GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
glEnable (GL_POINT_SPRITE);
glEnable(GL_TEXTURE_2D);
glColor3ub(255,255,255);

for(int i=0;i<heightmap->height-1;i++) {
        for(int j=0;j<heightmap->width-1;j++) {
            if( objectmap->get(i,j,0) && objectmap->get(i,j,0) <= nofObject ) {

            glBindTexture( GL_TEXTURE_2D, object [ objectmap->get(i,j,0) ].id );

            glBegin(GL_POINTS);
               glVertex3f(i+0.5,j+0.5,heightmap->get(i,j,0));
            glEnd();
            }
        }
    }

glPointSize(16);
glDisable (GL_POINT_SPRITE);
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
            glColor4ub(96,192,255,64);

    for(int i=0;i<heightmap->height-1;i++) {
        for(int j=0;j<heightmap->width-1;j++) {
           if(heightmap->get(i,j,0) < 64) {
            glBegin(GL_QUADS);
                //glTexCoord2f((float)i/heightmap->width,(float)j/heightmap->height);
                glVertex3f(i   ,j   ,64+((float)wavemap[(i+j*128)*2+swap]/32));
                //glTexCoord2f((float)(i+1)/heightmap->width,(float)(j)/heightmap->height);
                glVertex3f(i-1 ,j   ,64+((float)wavemap[(i-1+j*128)*2+swap]/32));
                //glTexCoord2f((float)(i+1)/heightmap->width,(float)(j+1)/heightmap->height);
                glVertex3f(i-1 ,j-1 ,64+((float)wavemap[(i-1+(j-1)*128)*2+swap]/32));
                //glTexCoord2f((float)(i)/heightmap->width,(float)(j+1)/heightmap->height);
                glVertex3f(i   ,j-1 ,64+((float)wavemap[(i+(j-1)*128)*2+swap]/32));
            glEnd();
            }
        }
    }

glDisable(GL_DEPTH_TEST);
sprintf(tmp," x %i y %i z %0.0f",ix,iy,z);
gl.DrawText2D(128,128,white,2.0f,0,tmp);

glPopMatrix();

 Conclusion

Features :
-projection dimétrique d'un terrain heightmappé et texturé
-Loader de texture tga,bmp & jpg
-selection de la case sous la souris
-affichage d'objet(arbres,batiments) (utilise l'extension point_sprite )
-simulation de l'eau ( vague )

Todo :
-lorsque j'aurai un carte graphique correcte, j'utiliserai l'extension frame buffer object pour faire le reflet de l'eau et ne rerendre qu'une partie de l'écran lors des translations
-possibilité de creation de route
-possibilité de creer un batiment -> selection du batiment -> debut d'interface pour créer des bonhommes
-pathfinding
-un vrai jeu ?

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 juillet 2006 18:42:44 :
terrain texturé - picking - petit changement de structure
10 juillet 2006 18:44:19 :
terrain texturé - picking - petit changement de structure
10 juillet 2006 18:44:51 :
terrain texturé - picking - petit changement de structure
11 juillet 2006 13:13:13 :
simulation de l'eau ( vague ) - affichage d'objet(arbres,batiments)
11 juillet 2006 13:13:53 :
simulation de l'eau ( vague ) - affichage d'objet(arbres,batiments)

 Sources du même auteur

Source avec Zip Source avec une capture DEBUT DE MODELEUR 3D
Source avec Zip Source avec une capture CLASSE WEBCAM AVANCÉ ET SON UTILISATION
Source avec Zip Source avec une capture MOTEUR 3D ISOMÉTRIQUE EN OPENGL

 Sources de la même categorie

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy
Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip Source avec une capture CLASSE AVEC OPENGL - OBJETS 3D ET ANIMATIONS par rasta63
Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec Zip CUBE 3D GLUT32 VC++ ET DEVC++ par bobby03

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec Zip Source avec une capture MOTEUR 3D : CASTOR3D par dragonjoker59
Source avec Zip Source avec une capture OPENGL SOUS LINUX par xave4552
Source avec Zip Source avec une capture MATRIX FALL X 3D (EFFET MATRIX EN 3D) par NoRabbit

Commentaires et avis

Commentaire de luhtor le 10/07/2006 15:56:00

En utilisant des vbos, tu aurais la meme chose mais avec 1000 de fps. Faut PLUS DU TOUT utiliser glBegin/end.

Commentaire de Mattpbem le 10/07/2006 18:37:16

personnellement la derniére fois que j'ai utilisé des VBOs j'ai eu une perte de vitesse . je pense que le plus gros probléme c'est qu'on ne peut pas avoir une liste d'index pour les vertices seulement et pas pour les coordonnées de textures si l'on veut un même vertex avec des coordonnées de texture differentes il faut dupliquer ce vertex ... c'est vraiment aberrant.
si quelqu'un trouve une solution à ce probléme j'utiliserai les VBO et les vertex arrays

à la limite si j'ai besoin de fps, j'utiliserai les call-lists car elle ne demandent pas plus de developement .

j'ai fais une nouvelle version qui supporte le texturing du terrain(voir screenshot) et une navigation plus aisée
ainsi que le picking (la case sur laquelle la souris est devient rouge )

je vais maintenant implémenter la gestion des object(batiments,arbre) et peut-être rajouter un plan d'eau avec des vagues et peut-être un reflet

Commentaire de luhtor le 10/07/2006 18:41:19

Les Displaylist, c'est bon pour le tout static. Ou est le pb de dubliquer des vertex dans la vram ?
Qu'est ce qui te dit que la display list fait pas la meme chose ?

Les perfs vbo sont quasiment égales aux displaylists (meme parfois supérieur), donc le prix des données dynamiques coute pas cher en performance si ils sont utilisés a peu près correctement. Mais dans son cas, utiliser un vbo est trivial et assure le 0% cpu, alors que son cpu est probablement a 100% la.

Commentaire de Mattpbem le 10/07/2006 18:47:29

il est vrai que l'avantage des vbo et des arrays et de limiter le nombre d'appels de fonction mais pour l'instant je ne suis pas limité par le CPU car je n'ai pas encore abordé l'aspect simulation

je ne peux pas mettre le code à jour . probléme ASPX... mais que fait le staff de Cppfrance !!!

Commentaire de luhtor le 10/07/2006 19:58:19

C'est pas un pb de nombre d'appel, c'est un probleme de synchronisation CPU GPU. Les vbos sont bien plus que ce que tu laisses imaginer.

Commentaire de shenron666 le 11/07/2006 20:02:25

comme le dit LUHTOR les DisplayList c'est bon pour le tout static
le problème des VBO étant qu'il s'agit d'une extension récente, elle n'est pas toujours bien supportée et donc optimisée, parfois pas gérée en 100% hardware
ne pas oublier qu'il y a toujours les vertex array, et une extension permet de les optimiser pour obtenir des vertex array compilés
je prépare un programme de test pour comparer tout ce petit monde
Le problème soulevé par Mattpbem à propos des vertex dupliqués n'a pas de solution, il faut juste y voir une optimisation, on consomme plus de mémoire pour gagner quelques dizaines de fps

Commentaire de luhtor le 11/07/2006 23:36:43

Oue mais vertex array, ca oblige en balancer par le bus toutes les données a chaque frame.

Commentaire de Mattpbem le 12/07/2006 10:35:26

de toute facon je dois balancer mes données à chaque frame
je peux maintenant changer les objets(tile,sprite,model) à tout moment .
j'arrête d'updater sur cpp-france parce que ca marche si vous voulez essayer le programme
allez sur http://matt2000.free.fr/release.rar

j'ai maintenant une user interface et un systéme de script minimal
je peux ajouter de nouveau objet (tile,sprite) sans recompiler

je pars pour quelques jour et j'aurai peut-être un nouvel ordi(et donc une carte graphique récente) samedi

vous pouvez commenter le programme aussi et pas seulement la methode d'affichage ^^ ?
ca ne coute rien de le downloader

ps: le screenshot ne correspond pas du tout mais je ne peux pas l'updater ainsi que le zip

Commentaire de shenron666 le 12/07/2006 20:17:24

LUHTOR > sauf les "Compiled Vertex Array", elles sont stockées en ram video
mais encore une fois, c'est une extension, enfin il faut bien les utiliser à un moment donné

Commentaire de luhtor le 12/07/2006 20:48:48

Les vertex array sont en ram. Sinon les vbos n'apporteraient rien.

Mais a part ca, ya des jeux qui utilisent cette perspective ?

Commentaire de Mattpbem le 14/07/2006 20:48:41

en fait Simcity 4 est entiérement en 3D mais orthogonale cela permet de ne pas recalculer toute l'image lors d'un translate de la caméra .

Commentaire de dletozeun le 18/07/2006 18:40:10

Le prophete Luhtor a encore frappé avec ses VBOs! ;)

"je pense que le plus gros probléme c'est qu'on ne peut pas avoir une liste d'index pour les vertices seulement et pas pour les coordonnées de textures si l'on veut un même vertex avec des coordonnées de texture differentes il faut dupliquer ce vertex ... c'est vraiment aberrant."

C'est a moitié ambigu ce que tu dis, a mon avis tu veux dire : dupliquer les coordonnées de texture puisque opengl pointe au meme index dans les buffer des vertices et des coordonnées de texture....
Oui c'est vrai ca prend seulemtn un peu plus de place masi c pas la mort quand on voit le peu de memoire video que ca va prendre dans la cg par raport aux textures ( et les cg actuelles depassent allegrement les 64 Mb de mem  ce qui est largement suffisant)

Toi tu voudrais un tableau d'indices pour les coordonnées de textures ( comme ca toutes les coordonnées de textures stockées serait unique), mais il va falloir creer un tableau d'indices qui comprend autant d'elements que de vertices, donc au final tu gagnes moins de 1/2 fois fois la taille d'un tableau de coodonnées de texture comprenant autant d'elements (element= coodornnée 2D) que de vertices.
Puisque il faut 1/2 fois la taille du tableau precedent pour stocker les indices des coordonnées de textures + le tableau contenat les coordonnées de texture uniques...

Bon j'espere que cette reflexion n'est pas le fruit d'une grosse connerie, ca peut m'arrivier!)

Mais donc tu vois bien que c'est inutiles de se casser la tete avec des indices pour les coordonnées de texture.
Et si les VBOs sont gerer par la cg ya rien de plus rapide et de plus apaisant pour le proceseur!

Commentaire de Mattpbem le 19/07/2006 23:22:06

je n'ai plus trop le temps de developper là,
j'ai un nouvel ordi depuis samedi et j'ai installé ubuntu, je suis en train de profiter de mes jeux avec une qualité normale (ma carte graphique est beaucoup plus puissante maintenant ^^ . et j'ai mis pas mal de temps à faire marcher gtkradiant (j'ai du le compiler moi-même car il n'est pas disponible en amd64 ). j'ai pas trop suivi l'histoire pour les vbos mais je pense que le gain de place est superieur : 2*sizeof(float) > sizeof(int)

Commentaire de dletozeun le 20/07/2006 17:55:51

Ben lis correctement cette histoire et tu verras que ca focntionne que je dis.

Et je comprend pas tellement : "mais je pense que le gain de place est superieur" ? Lis le paragraphe si tu veux comprendre...

ET puis sizeof(int)=sizeof(float) il me semble.

Commentaire de Mattpbem le 24/07/2006 17:59:40

j'ai reussi a faire marcher mon programme sous ubuntu
je comprends maintenant le probleme (j'ai toujours 28fps et consommation CPU a fond)
je vais donc essayer les VBOS :) (puis utiliser les FBOS aussi )

en 32bit int = float ca c'est sur mais je ne sais pas si cest vrai sur un 64bit peut-etre qu'il fait les calculs flottants sur 32bit
de toute facon ce n'est pas ma priorite et c'est comme ca .

Commentaire de Mattpbem le 26/07/2006 16:52:11

j ai termine avec les VBOs et les Fbos
le programme tourne maintenant a vitesse variable
200fps lorsque rien ne se passe sauf translation et scale
100fps lorsque la souris bouge
20fps lors de changement du terrain

par contre le programme est tres gourmand en memoire graphique :
j'alloue 2 textures de 4096*4096 et 1 depth buffer 24bit de la meme taille

la source est un binaire pour linux est disponible ici :
http://matthias.fauconneau.googlepages.com/home

vous aurez besoin des packages/librairies suivant(es) :
SDL png zlib jpeg GL GLU

PS:en ce wui concerne la multiplication de vertex c'est tout de meme
3float vs 1 short donc 6x plus
mais ce n'est rien par rapport au 3 enorme texture que j'utilise

Commentaire de dletozeun le 26/07/2006 18:28:45

Tu affiche combien de polygones?

Pour les processeurs 64 bits je sais pas comment ca se passe.

Tes enormes textures c'est pour calculer le multitexturing sur ta map? En effet c'est une methode tres tres gourmande! Je suis meme pas sur de pouvoir lancer ton appli sur mon pc et encore....si j'avais linux!

Commentaire de Mattpbem le 27/07/2006 12:24:54

tu n'est pas oblige d avoir linux j'utilise SDL donc tu devrais pouvoir compiler sans probleme

il ny a aucun multitexturing en fait je render mon terrain sur une texture (comme si je l'affichais a l'ecran)
comme ca je le render qu'une seul fois et je peux bouger sans le re render

pour le probleme des VBOS cest que si je ne veux pas quadruples les vertices il faut que je fasse en 4fois
car un vertices peut participer a 4 cases donc 4 TexCoords differents, ma solution est de rendre quatres fois en decalant les cases a chaque fois

peut-etre que avec un bout de code ce sera plus comprehensible :

#include "../../include/terrain.h"

void CTerrain::DrawTile() {
/**
0 0 Tile Updating
**/

glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOTileTexCoords );
glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
float* TexCoords = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);
for(int i=0;i<map->height-1;i+=2) {
    for(int j=0;j<map->width-1;j+=2) {

        TexCoords[(i*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+0 ])/tiletex->width; // 0 0 u
        TexCoords[(i*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+1 ])/tiletex->height; // 0 0 v

        TexCoords[((i+1)*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+2 ])/tiletex->width; // 1 0 u
        TexCoords[((i+1)*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+3 ])/tiletex->height; //1 0 v

        TexCoords[((i+1)*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+4 ])/tiletex->width; //1 1 u
        TexCoords[((i+1)*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+5 ])/tiletex->height; //1 1 v

        TexCoords[(i*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+6 ])/tiletex->width; //0 1 u
        TexCoords[(i*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+7 ])/tiletex->height; //0 1 v
    }
}
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, VBOTileIndices); /// Use Tile Indices
unsigned short* Indices = (unsigned short*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

//Tile is rendered upon Terrain : you can use transparent tile
int u = 0;
for(int i=0;i<map->height-1;i+=2) {
    for(int j=0;j<map->width-1;j+=2) {
        if( map->get(i,j,1) && map->get(i,j,1) < nofObject ) { //if valid object render
            Indices[u] = i*map->width+j; // 0 0
            Indices[u+1] = (i+1)*map->width+j; // 1 0
            Indices[u+2] = (i+1)*map->width+j+1; // 1 1
            Indices[u+3] = (i)*map->width+j+1; // 0 1
            u+=4;
        }
    }
}
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);

glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOVertices ); /// Keep Terrain Vertices
glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );


/**
Tile rendering
**/
glDisable(GL_DEPTH_TEST); //always render upon
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);

glColor3ub(255,255,255);
glBindTexture(GL_TEXTURE_2D,tiletex->id);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawElements(GL_QUADS, u, GL_UNSIGNED_SHORT, 0);

/**
1 0 Tile Updating
**/
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOTileTexCoords );
glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
TexCoords = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

for(int i=1;i<map->height-1;i+=2) {
    for(int j=0;j<map->width-1;j+=2) {

        TexCoords[(i*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+0 ])/tiletex->width; // 0 0 u
        TexCoords[(i*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+1 ])/tiletex->height; // 0 0 v

        TexCoords[((i+1)*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+2 ])/tiletex->width; // 1 0 u
        TexCoords[((i+1)*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+3 ])/tiletex->height; //1 0 v

        TexCoords[((i+1)*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+4 ])/tiletex->width; //1 1 u
        TexCoords[((i+1)*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+5 ])/tiletex->height; //1 1 v

        TexCoords[(i*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+6 ])/tiletex->width; //0 1 u
        TexCoords[(i*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+7 ])/tiletex->height; //0 1 v
    }
}
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, VBOTileIndices); /// Use Tile Indices
Indices = (unsigned short*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

//Tile is rendered upon Terrain : you can use transparent tile
u = 0;
for(int i=1;i<map->height-1;i+=2) {
    for(int j=0;j<map->width-1;j+=2) {
        if( map->get(i,j,1) && map->get(i,j,1) < nofObject ) { //if valid object render
            Indices[u] = i*map->width+j; // 0 0
            Indices[u+1] = (i+1)*map->width+j; // 1 0
            Indices[u+2] = (i+1)*map->width+j+1; // 1 1
            Indices[u+3] = (i)*map->width+j+1; // 0 1
            u+=4;
        }
    }
}
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);

/**
Render 1 0 tile
**/
glDrawElements(GL_QUADS, u, GL_UNSIGNED_SHORT, 0);

/**
1 1 Tile Updating
**/
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOTileTexCoords );
glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
TexCoords = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

for(int i=1;i<map->height-1;i+=2) {
    for(int j=1;j<map->width-1;j+=2) {

        TexCoords[(i*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+0 ])/tiletex->width; // 0 0 u
        TexCoords[(i*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+1 ])/tiletex->height; // 0 0 v

        TexCoords[((i+1)*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+2 ])/tiletex->width; // 1 0 u
        TexCoords[((i+1)*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+3 ])/tiletex->height; //1 0 v

        TexCoords[((i+1)*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+4 ])/tiletex->width; //1 1 u
        TexCoords[((i+1)*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+5 ])/tiletex->height; //1 1 v

        TexCoords[(i*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+6 ])/tiletex->width; //0 1 u
        TexCoords[(i*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+7 ])/tiletex->height; //0 1 v
    }
}
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, VBOTileIndices); /// Use Tile Indices
Indices = (unsigned short*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

//Tile is rendered upon Terrain : you can use transparent tile
u = 0;
for(int i=1;i<map->height-1;i+=2) {
    for(int j=1;j<map->width-1;j+=2) {
        if( map->get(i,j,1) && map->get(i,j,1) < nofObject ) { //if valid object render
            Indices[u] = i*map->width+j; // 0 0
            Indices[u+1] = (i+1)*map->width+j; // 1 0
            Indices[u+2] = (i+1)*map->width+j+1; // 1 1
            Indices[u+3] = (i)*map->width+j+1; // 0 1
            u+=4;
        }
    }
}
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);

/**
Render 1 1 tile
**/
glDrawElements(GL_QUADS, u, GL_UNSIGNED_SHORT, 0);

/**
0 1 Tile Updating
**/
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOTileTexCoords );
glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
TexCoords = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

for(int i=0;i<map->height-1;i+=2) {
    for(int j=1;j<map->width-1;j+=2) {

        TexCoords[(i*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+0 ])/tiletex->width; // 0 0 u
        TexCoords[(i*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+1 ])/tiletex->height; // 0 0 v

        TexCoords[((i+1)*map->width+j)*2] = float(tileUV[ map->get(i,j,1)*8+2 ])/tiletex->width; // 1 0 u
        TexCoords[((i+1)*map->width+j)*2+1] = float(tileUV[ map->get(i,j,1)*8+3 ])/tiletex->height; //1 0 v

        TexCoords[((i+1)*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+4 ])/tiletex->width; //1 1 u
        TexCoords[((i+1)*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+5 ])/tiletex->height; //1 1 v

        TexCoords[(i*map->width+j+1)*2] = float(tileUV[ map->get(i,j,1)*8+6 ])/tiletex->width; //0 1 u
        TexCoords[(i*map->width+j+1)*2+1] = float(tileUV[ map->get(i,j,1)*8+7 ])/tiletex->height; //0 1 v
    }
}
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, VBOTileIndices); /// Use Tile Indices
Indices = (unsigned short*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);

//Tile is rendered upon Terrain : you can use transparent tile
u = 0;
for(int i=0;i<map->height-1;i+=2) {
    for(int j=1;j<map->width-1;j+=2) {
        if( map->get(i,j,1) && map->get(i,j,1) < nofObject ) { //if valid object render
            Indices[u] = i*map->width+j; // 0 0
            Indices[u+1] = (i+1)*map->width+j; // 1 0
            Indices[u+2] = (i+1)*map->width+j+1; // 1 1
            Indices[u+3] = (i)*map->width+j+1; // 0 1
            u+=4;
        }
    }
}
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);

/**
Render 0 1 tile
**/
glDrawElements(GL_QUADS, u, GL_UNSIGNED_SHORT, 0);
}

Commentaire de dletozeun le 27/07/2006 16:09:00

"pour le probleme des VBOS cest que si je ne veux pas quadruples les vertices il faut que je fasse en 4fois
car un vertices peut participer a 4 cases donc 4 TexCoords differents, ma solution est de rendre quatres fois en decalant les cases a chaque fois "

Je sais pas moi, ca depend de ce que tu veux faire exactement...

"il ny a aucun multitexturing en fait je render mon terrain sur une texture (comme si je l'affichais a l'ecran)
comme ca je le render qu'une seul fois et je peux bouger sans le re render"

La j'ai un peu de mal a comprendre...tu fasi du render to texture?? Si c'est le cas le vois pas l'utilité, et je sais toujours pas si tu créé ta texture proceduralement ou si tu l'a deja dans un fichier externe.

Et la j'ai pas les moyens de compiler...

Commentaire de Mattpbem le 31/07/2006 20:36:58

oui je fais un render to texture du terrain . je n'ai pas deja affiche le terrain dans un fichier externe
et comme cest un vue orthogonale quand je translate ou scale ca ne deforme pas le terrain donc pas besoin de le rendre a chaque frame

normalement tu peux compiler sans probleme sous window$

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

OpenGl et objets 3D [ par mshn ] bonjour, est ce qu'on peux céer des objets 3D sous OpenGl, et les manipuler (animer et déplacer) par programme en utilisant un environnement de C++ ? Charger un model 3D en C++ avec opengl [ par smoove5198 ] Bonjour,j'essaye depuis un moment de charger un model 3D avec opengl en C++, pour ca j'utilise le seul format de fichier que je connaisse et dont j'ai Création de terrain 3d [ par pitap0 ] BOnjour a toutes la communauté Voili je cherche des sites, infos traitants Directx 8.1 sous visual C++ (6) plus precisement sur la création de terrain Moteur 3d OpenGL [ par Stormy ] Salut. Je recherche des personnes motives pour travailler sur un moteur 3d sous OpenGL. Les bases sont deja etablies (Detection de collisions, sons, m Objects 3D Opengl [ par mastave ] Comment inclure dans un fenêtre OpenGl un fichier 3D DXF ou3DS??? Projet OpenGl [ par barraq ] salut,Voila j'ai un projet a faire pour ma fac, je doit réaliser tout un environement 3d en opengl .Je doit pouvoir me deplacer dans une map donnée et 3d opengl [ par darvil ] Qui peu m'aider?je cherche de quoi developer sur mac en 3d . Je cherche une adreese ou tlecharger un compilateur des logiciels 3d. comment fair march Deplacement d'un personnage en OpenGL [ par Clercq ] Bonjour a tous,&nbsp;&nbsp;&nbsp;J'ai parcourus les sources de ce site mais je n'ai pas concretement trouv&#233; reponse a ma question, en fait j'ai c OpenGL 3D [ par jojomillenium ] Bonjour, J'aimerai créer une application qui me permette de charger une liste de cube (coordonnée et taille) et les placer dans un espace 3D et pouvoi Problème avec OpenGL [ par Xaviou ] Bonjour, Je suis en train de r&#233;aliser un prog permettant de visualiser des fichiers 3D au format STL. Si j'&#233;x&#233;cute mon prog depuis Visu


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales