MOTEUR 3D DIMETRIQUE

Signaler
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38507-moteur-3d-dimetrique

Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006

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$
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008

"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...
Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006

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);
}
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008

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!
Afficher les 20 commentaires