Vereis, e creado un programa en c++ builder que carga un heightmap bmp y exporta un .map , donde están los vertices y los triangulos (osea los indices). asi como otras cosas que no son de interes.
Vereis, el problema que tengo es el siguiente: la rutina de creacion de triangulos parece estar mal por como renderiza, pero no veo donde está el fallo... Shots del render (renderizo usando DrawPrimitiveUP, poniendo un array de vertices creado de la lista de vertics y de triangulos. Vaya, que eso no es).
Wireframe:
(http://www.warcraft3es.com/wire.gif)
Aquí veis que uno de los fallos está al final de las filas, ya que se enlaza el ultimo triangulo con el primero de la otra...
Sólido:
(http://www.warcraft3es.com/solid.gif)
Segundo fallo, solo renderiza la mitad de triangulos (¿?)
El codigo del generador es el siguiente:
char aux[250];
numTriang = (width-1)*(height-1)*2;
numVertices = (width-1)*(height-1)*4;
numIndex = (width-1)*(height-1)*2*3;
if (numIndex > 65000)
ShowMessage("ERROR! Demasiados indices, utiliza una textura más pequeña");
else
{
vertices = new sVERTEX[numVertices];
triangles = new sTRIANGLE[numTriang];
// generacion
Byte *ptr;
Byte *ptr2;
for (int i = 0;i<(height-1);i++)
{
ptr = (Byte *)map->Picture->Bitmap->ScanLine[i];
ptr2 = (Byte *)map->Picture->Bitmap->ScanLine[i+1];
for (int j = 0;j<(width-1);j++)
{
GenerateQuad(i,j,ptr[j],ptr[j+1],ptr2[j],ptr2[j+1]);
}
}
unsigned int current = 0;
for (unsigned int i = 0; i < numTriang; i+=2)
{
triangles[i].v1 = current;
triangles[i].v2 = current+1;
triangles[i].v3 = current+2;
triangles[i+1].v1 = current;
triangles[i+1].v2 = current+2;
triangles[i+1].v3 = current+4;
current+=4;
}
// y generateQuad es...
void GenerateQuad(int z, int x, Byte h1, Byte h2, Byte h3, Byte h4)
{
vertices[current].x = x;
vertices[current].y = h1;
vertices[current].z = z;
vertices[current].u = 0.0f;
vertices[current].v = 0.0f;
current++;
vertices[current].x = x+1;
vertices[current].y = h2;
vertices[current].z = z;
vertices[current].u = 1.0f;
vertices[current].v = 0.0f;
current++;
vertices[current].x = x+1;
vertices[current].y = h4;
vertices[current].z = z+1;
vertices[current].u = 1.0f;
vertices[current].v = 1.0f;
current++;
vertices[current].x = x;
vertices[current].y = h3;
vertices[current].z = z+1;
vertices[current].u = 0.0f;
vertices[current].v = 1.0f;
current++;
}
Yo creía que en " triangles[i+1].v3 = current+4;" había un fallo, ya que debería haber un 3 en vez de 4. Pero al hacerlo, renderiza así:
(http://www.warcraft3es.com/render.gif) y ademas, si mueves la camara algunos triangulos desaparecn y otros aparecen .. Tengo el backculling ese desactivao, y el far y near bien puestos.
Para que entendais un poco como funciona, os dire ke ptr = (Byte *)map->Picture->Bitmap->ScanLine; toma los valores de los pixeles de esa fila, para las alturas. (aunque recordemos que el fallo esta en los x & z) Creo tanto los vertices como los triangulos por quads, osea de 4 en 4. Algo así:
(http://www.warcraft3es.com/quad1.gif) (http://www.warcraft3es.com/quad2.gif)
NOTa: ande pone 5 tien k pone 7
Realmente estoy atascao con esto xq no se ke leches pasa, si alguien sabe ke leches pasa...
thx
pd: si kereis el resultado de un .map de un heightmap de 4x4 (para ke no aia tanta cosa) es esto:
STARSHIP ARENA MAP FILE
Width: 4
Height: 4
Vertices: 36
0.000000 0.000000 0.000000 0.000000 0.000000
1.000000 0.000000 0.000000 1.000000 0.000000
1.000000 0.000000 1.000000 1.000000 1.000000
0.000000 0.000000 1.000000 0.000000 1.000000
1.000000 0.000000 0.000000 0.000000 0.000000
2.000000 0.000000 0.000000 1.000000 0.000000
2.000000 0.000000 1.000000 1.000000 1.000000
1.000000 0.000000 1.000000 0.000000 1.000000
2.000000 0.000000 0.000000 0.000000 0.000000
3.000000 0.000000 0.000000 1.000000 0.000000
3.000000 0.000000 1.000000 1.000000 1.000000
2.000000 0.000000 1.000000 0.000000 1.000000
0.000000 0.000000 1.000000 0.000000 0.000000
1.000000 0.000000 1.000000 1.000000 0.000000
1.000000 0.000000 2.000000 1.000000 1.000000
0.000000 0.000000 2.000000 0.000000 1.000000
1.000000 0.000000 1.000000 0.000000 0.000000
2.000000 0.000000 1.000000 1.000000 0.000000
2.000000 0.000000 2.000000 1.000000 1.000000
1.000000 0.000000 2.000000 0.000000 1.000000
2.000000 0.000000 1.000000 0.000000 0.000000
3.000000 0.000000 1.000000 1.000000 0.000000
3.000000 0.000000 2.000000 1.000000 1.000000
2.000000 0.000000 2.000000 0.000000 1.000000
0.000000 0.000000 2.000000 0.000000 0.000000
1.000000 0.000000 2.000000 1.000000 0.000000
1.000000 0.000000 3.000000 1.000000 1.000000
0.000000 0.000000 3.000000 0.000000 1.000000
1.000000 0.000000 2.000000 0.000000 0.000000
2.000000 0.000000 2.000000 1.000000 0.000000
2.000000 0.000000 3.000000 1.000000 1.000000
1.000000 0.000000 3.000000 0.000000 1.000000
2.000000 0.000000 2.000000 0.000000 0.000000
3.000000 0.000000 2.000000 1.000000 0.000000
3.000000 0.000000 3.000000 1.000000 1.000000
2.000000 0.000000 3.000000 0.000000 1.000000
Triangles: 18
0 1 2
0 2 3
4 5 6
4 6 7
8 9 10
8 10 11
12 13 14
12 14 15
16 17 18
16 18 19
20 21 22
20 22 23
24 25 26
24 26 27
28 29 30
28 30 31
32 33 34
32 34 35
FILE END
aprovcho pa decir, ke en el shot en blanco y negro, despues de acer ese cambio, no renderiza 1 triang si 1 no, renderiza bien en ese aspecto.
Casi que me aventuraría a darte un par de hipótesis, cada una para cada parte de tu problema:
Para el problema del "1 sí, 1 no" diría que la cosa está en que pones las normales de las caras una hacia arriba y otra hacia abajo.
Para el problema de la unión del último triángulo con el primero, deberías desactivar la creación de triángulos una vez has recorrido cada columna del mapa, y volverlo a activar al comenzar la siguiente.
En fin, espero que te sirva de alguna ayuda.
weno, normales ni uso xq no uso nada de lighting.
y lo otro, y lo de 1 si 1 no, se corrige con el cambio ese que hago del 4 por el 3. (si ves el otro shot, el que se ven solo "trozos volantes" de terreno). Pero claro, ahora el fallo es ese , ke se ven solo trozos :
Lo de que "Yo creía que en " triangles[i+1].v3 = current+4;" había un fallo, ya que debería haber un 3 en vez de 4", creo q tenias razon, ahi hay un fallo, tiene que haber un 3.
En cuanto lo que dices de q cuando lo cambias te salen segmentos de terreno en el aire y aparecen y desaparecen.... ya se que dices que tienes el culling desactivado.... pero por la imagene ese problema tienes tienen pinta de ser culpa del backface culling.
Asegurate q lo tienes desactivado poniendo esto antes de dibujar el terreno:
SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
Joder.. no lo tenia activado, pero tampoco desactivado (el codigo de desactivacion lo tenia comentado). Lo e descomentado y voilà!
(http://www.warcraft3es.com/sad.GIF)
thxx lord tarncos ;****
Yo de mayor quiero ser como Lord Trancos 8O
CoLsoN2, por defecto en DirectX hay ciertas cosas activadas como por ejemplo el backface culling, asi q si no quieres usarlos se lo has de indicar.
De todos modos te recomiendo q acabes usando el backface culling (viendo tus poligonos parece que son CW) ya q por lo general no te importara que el terreno no se pinte por abajo o por detras...
gracias a los dos por vuestros elogios, pero simplemente soy un paraooo al q le sobra el tiempo libre para ayudar ;)
si son CW. Ya lo activaré para CW.
P.D: espero ke sigas parao muxo tiempo y nos aiudes! XDDDDDDDDD es coñaaaa, as probao en buscar curro en el sector?
Citar
P.D: espero ke sigas parao muxo tiempo y nos aiudes! XDDDDDDDDD es coñaaaa, as probao en buscar curro en el sector?
pues la verdad es q nop... :I de todos modos no se programar en VC (aunque si en C) asin q (por ahora) no creo q tuviera muchas posibilidades...
Hace poco buscaban gente con conocimientos de Delphi en CIRSA pero no sé si ya la encontraron. En fin, por probar... ;)
Sync
Tranquete, explícame eso de que sabes programar en C y NO en VC ;)
Hablas de que no estás acostumbrado a la IDE, o hablas de esas chorradas de marketing en plan academia. O te refieres a MFC?
1) io tpc tengo nidea de MFC XD
2) despues de comprobar algunas cosas raras en el render, en cuanto a las montañas ke salian y tal,ke no cuadraban con los heightmap, hice la siguiente prueba: puse este heightmap:
(http://www.warcraft3es.com/map.gif)
como podeis comprobar, tiene 6 barras horizontales y 2 barras verticales gordas asi como 7 mas pequeñas. El resultado, sin embargo es este:
6 horizontales .. OK
(http://www.warcraft3es.com/otro1.gif)
peeeeero, solo la primera gorda vertical y 5 (en la 5º se corta) pequeñas.
(http://www.warcraft3es.com/otro2.gif)
alguien me lo explique??? la cantidad de vertices, sin embargo, es la que debería ser. Y ya en el .map veo que esto está mal. Viendo el algoritmo que hay en el primer post deste topic podeis ver xq pasa esto ?? o_O
sync por ahora creo q me buscare algun trabajo ""normal"" como informatico en alguna empresa de por aqui cerca, lo de los juegos para mi es (por ahora) un hobby, tal vez mas adelante intente aventurarme profesionalmente en ese mundo.
grunni se ANSI C aunque no demasiado, lo basico, lo suficiente para no tener demasiados problemas para entender el codigo de los ejemplos q encuentro por aqui y por alla. pero si me pongo a hacer un programa en C me cuesta horrores... me vuelvo loco con tantos herrores y lo quisquilloso q es el muy #~@#~@~ xDDD no se, me encuentro mas a gusto con el Pascualin
colson creo que estas leyendo incorrectamente en bitmap; probablemente no sea de 8bpp (aunque el bmp sea de 8bpp, al cargarlo seguramente el windows te lo cambia de formato o algo asi), por eso supongo que te sale bien las rayas horizontales y no las verticales.... creo que no lees la parte derecha de la imagen,... por eso solo sale una barra vertical... no se si me explico. Weno, si eso te lo explico con mas paciencia luego q ahora tengo hambre :P
for (int i = 0;i<(height-1);i++)
{
ptr = (Byte *)map->Picture->Bitmap->ScanLine[i];
ptr2 = (Byte *)map->Picture->Bitmap->ScanLine[i+1];
for (int j = 0;j<(width-1);j++)
{
GenerateQuad(i,j,ptr[j],ptr[j+1],ptr2[j],ptr2[j+1]);
}
}
segun este codigo, que es donde leo el bitmap, todo deberia ir bien. lo jodidamente raro es: la en vertical se lee bien pero enhorizontal solo se lee 1/3 de todo el heightmap mas o menos (¿?) y también, al renderizar, es un cuadrado como el heightmap, a pesar de ke solo se lee un trozo en ancho (¿?) .. no lo entiendo
veras, no estoy muy seguro de esto, pero creo recordar que cuando tu cargas un bmp en windows el te lo convierte a un "formato adecuado". Es decir, aunque tu bmp sea de 8bpp, es muy posible que al cargarlo en windows te lo convierta a 24bpp (esto supongo q depende del modo de video en el que tienes el windows).... por eso solo te lee 1/3 en horizontal,... pq tu estas tratando el bitmap como si tuviera 1 byte por pixel y en verdad tiene 3 bytes!!! (o 2 bytes...no se...)
supongo q debe de haber alguna forma de acceder al "bmp original" (el de 1byte = 1 pixel) y no al bmp que windows te crea en memoria. si no encuentras ninguna llamada del API que te permita esto, puedes "cargar a mano" el BMP, q no es un formato demasiado complejo...
ya probé a acerlo a mano y tuve algunos problemillas. luego con directx tb. y ara lostoi cargando con el componente TBitmap de C+ builder XD por eso me extraña que no funcione, mas ke na xq ago lo mismo ken el ejemplo que pone la ayuda ,,,
p.d: trancos nunca t pasas por #stratos en el irc ?:P
vaya Trankín, vuelves a acertar. E puesto la propiedad PixelFormat del TBitmap a 8bits, y voilà =) thxx (otra ve) ;**
de nah, hombre ;)
en cuanto a lo del irc, muy raramente se me ve el pelo por alli
El render estaba hecho con drawPrimitiveUP, y ahora al intentar pasarlo a Vertex e index buffers, cosa que con modelos me va de coña, justo al hacer el render desde el index buffer peta el programa. He loggeado la cantidad de vertices y indices que se indica tanto en la clase que he hecho para manejarlos como internamente (con IBUFF->GetDesc()..) y coincide. No se xq pasa.
NOTA: Son unos 50,000 y pico vertices, no pasa del limite de 65,535 (era este?).
Log("ib");
if (m_ib->Render(m_vb->m_vb,dev) == false)
{
Log("ERROR! Rendering failed");
return false;
}
Log("ib2");
lo último que se muestra en el log es "ib"... dev está bien creado, es el Device. y m_vb tambien está bien. Código de Render()..
if (FAILED(dev->SetStreamSource(0, vb, sizeof(sVERTEX))))
return false;
if (FAILED(dev->SetIndices(m_ib, 0)))
return false;
if (FAILED(dev->DrawIndexedPrimitive(m_primiType,0,m_numIndices,
0, m_numIndices/3)))
return false;
numIndices es correcto y primitType tb.
Datos:
Vertices: 36100
Indices: 54150
k cosas mas raras oie..