Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda por favor, tengo un problema.

Iniciado por Loopen, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Loopen

                                Tengo un problema, estoy intentando implementar una funcion para poder asignarle los vertices de un triangulo a un buffer,uso DX8, el problema q tengo es q soy muy novato en esto y la funcion me falla en algo, lo que he observado es que el puntero al buffer no conserva su valor cuando salgo de la funcion, alguien me puede ayudar, os pongo el codigo de la funcion
   

void CreaBufferVertice(IDirect3DDevice8 *obj_dispositivo_D3D,unsigned char a,IDirect3DVertexBuffer8 *Triangulo,Vertice Triangulo_vertices[]){


HRESULT hr;
unsigned char *vb_vertices;




hr=obj_dispositivo_D3D->CreateVertexBuffer(a,D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,
                                      D3DPOOL_MANAGED,&Triangulo);      
                                                     
 
 
if(FAILED(hr)){
     Error_Fatal(
"Error al crear el buffer del triangulo");
  }

 

  hr=Triangulo->Lock(0,
// Offset(Desplazamiento), 0 por que queremos empezar desde el inicio
                      0,
// Tamaño de bloqueado, 0 significa bloquear todo el buffer
                      &vb_vertices,
// Si es exitoso eso apuntará a la memoria que deseamos
                      0);  
//Banderas, nada en especial

 
 
if(FAILED(hr)){
     Error_Fatal(
"Error bloqueando el buffer del triangulo");
  }
 
 
// vb_vertices ahora apunta hacia el buffer que deseamos, ahora copiamos los datos
  memcpy(vb_vertices, Triangulo_vertices, a );

 
// Desbloqueamos el buffer
  Triangulo->Unlock();


}



                               

_Grey

                               
Como tu dices el problema estara en el puntero........

cada vez que quieras acceder a este buffer tendras que hacer ->Lock(), por que la posicion de los datos puede variar y directx entiende cuando haces ->Unlock() que te los puede mover de sitio.........                                

Loopen

                                Y de que manera podria hacerlo, es que me gustaria poder meter estas cosas en funcioncillas para luego no tener que repetir todo.                                

_Grey

                               
jeje.... ahora que me fijo, tengo que advertirte de que e visto algo mas...

como veo en esta funcion es donde haces la copia de los datos, es decir que no juegas con el puntero despues de esta funcion como yo pensaba....

y los errores que he visto ahora son:

CreateVertexBuffer() : el parametro "a" supongo que sera la cantidad de vertices que tiene que mantener el vertexbuffer?? no?? pues lo que tienes que ponerle es la cantidad de memoria que ocupara, no se si me explico... suponiendo que cada vertice ocupe 80bytes el valor de a tendria que ser cantidad_de_vertices*80, la manera mas facil de hacerlo es:
  si la estructura de los vertices se llama MyVertex,por poner un ejemplo, pondriamos:
  hr=obj_dispositivo_D3D->CreateVertexBuffer(cantidad_de_vertices*sizeof(MyVertex),D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,D3DPOOL_MANAGED,&Triangulo);

En el memcpy has de hacer lo mismo puesto que copia "a" cantidad en bytes y tus vertices ocupan mas.

Tambien deberias cambiar:
IDirect3DDevice8 *obj_dispositivo_D3D por esto LPDIRECT3DDEVICE8 obj_dispositivo_D3D
IDirect3DVertexBuffer8 *Triangulo por esto LPDIRECT3DVERTEXBUFFER8 Triangulo

por ultimo tengo que decirte que el puntero de vertexBuffer que creas en Triangulo no sale de la funcion, supongo que pasas un puntero de LPDIRECT3DVERTEXBUFFER8 a la funcion en su tercer parametro(Triangulo) si es asi quitale el & en el CreateVertexBuffer.

Espero no haberte liado mas.... tenia muchas cosas que plantear........

y si no ... ya llegara berserker...... o, no?

Saludotes.

P.D.: hey!! acabo de leer tu segundo mensaje... a ke te refieres...                                

_Grey

                               
Como veo que esto esta algo liado .... me e tomado algunas "libertades artisticas", y me ha salido esto:


// Suponiendo que a sea la cantidad de vertices
// Y que la estructura de los vertices se llama Vertice
// Y la llamada seria por ejemplo, asi : CreaBufferVertice(Device3D,10,&VertexBufferExterno,array_de_vertices)

void CreaBufferVertice(LPDIRECT3DDEVICE8 obj_dispositivo_D3D,unsigned char a,LPDIRECT3DVERTEXBUFFER8 Triangulo,Vertice Triangulo_vertices[]){


HRESULT hr;
unsigned char *vb_vertices;



// Ten encuenta que con D3DUSAGE_WRITEONLY    NO PODRAS LEER EL CONTENIDO DEL VERTEXBUFFER
hr=obj_dispositivo_D3D->CreateVertexBuffer(a*sizeof(Vertice),D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,
                                      D3DPOOL_DEFAULT,Triangulo);      
                                                     
 
  if(FAILED(hr)){
     Error_Fatal("Error al crear el buffer del triangulo");
  }

 

  hr=Triangulo->Lock(0, // Offset(Desplazamiento), 0 por que queremos empezar desde el inicio
                      0, // Tamaño de bloqueado, 0 significa bloquear todo el buffer
                      &vb_vertices, // Si es exitoso eso apuntará a la memoria que deseamos
                      0);  //Banderas, nada en especial

 
  if(FAILED(hr)){
     Error_Fatal("Error bloqueando el buffer del triangulo");
  }
 
  // vb_vertices ahora apunta hacia el buffer que deseamos, ahora copiamos los datos
  memcpy(vb_vertices, Triangulo_vertices, a*sizeof(Vertices) );

  // Desbloqueamos el buffer
  Triangulo->Unlock();


}

lo siento ... yo no se hacer una tabla :triste:

bye!                                

Loopen

                                Muchas gracias a los dos, pero esto me sigue sin ir, una pregunta, q diferencia hay entre las variables q habia creado yo y las q me habeis dicho, me refiero al VertexBuffer                                

_Grey

                                Supongo que te refieres al LPDIRECT3DVERTEXBUFFER8, el LP significa LONG POINTER, con lo cual el LPDIRECT3DVERTEXBUFFER8 es un PUNTERO a un objeto vertexBuffer, el IDIRECT3DVERTEXBUFFER8 es el objeto en si, pero con el LP especificas esplicitamente que es un puntero, vamos que te ahorras el asterisco(*).                                

Loopen

                                Muchas gracias, casi da vergüenza preguntar tanto, se nota q soy mu novatillo, pero ya veo que x aki hay buena gente, siempre dispuesta a ayudar
                               

Loopen

                                A ver, os posteo otra vez como ha quedado mi codigo, tengo el mismo error, el problema es que fuera de la funcion, el VertexBuffer no me toma valor, estoy ya desesperao, porque puede ser esto.

   


void CreaBufferVertice(LPDIRECT3DDEVICE8 obj_dispositivo_D3D,unsigned char a,LPDIRECT3DVERTEXBUFFER8 Triangulo,Vertice Triangulo_vertices[]){


HRESULT hr;
unsigned char *vb_vertices;



// Ten encuenta que con D3DUSAGE_WRITEONLY NO PODRAS LEER EL CONTENIDO DEL VERTEXBUFFER
hr=obj_dispositivo_D3D->CreateVertexBuffer(a*
sizeof(Vertice),D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,
D3DPOOL_DEFAULT,&Triangulo);


if(FAILED(hr)){
Error_Fatal(
"Error al crear el buffer del triangulo");
}



hr=Triangulo->Lock(0,
// Offset(Desplazamiento), 0 por que queremos empezar desde el inicio
0,
// Tamaño de bloqueado, 0 significa bloquear todo el buffer
&vb_vertices,
// Si es exitoso eso apuntará a la memoria que deseamos
0);
//Banderas, nada en especial


if(FAILED(hr)){
Error_Fatal(
"Error bloqueando el buffer del triangulo");
}

// vb_vertices ahora apunta hacia el buffer que deseamos, ahora copiamos los datos
memcpy(vb_vertices, Triangulo_vertices, a*
sizeof(Vertice) );

// Desbloqueamos el buffer
Triangulo->Unlock();


}





En el CreateVertexBuffer he tenido que poner como ultimo parametro &Triangulo, porque a pesar de que Triangulo ya es un puntero, la funcion necesita un puntero a puntero.

He probao a pasarle a la funcion en la cabecera el puntero a puntero **, pero entonces el compilador se queja al hacer el Triangulo-> Lock
y el
Triangulo -> Unlock

Por favor, agradeceria un monton vuestra ayuda, me estoy devanando los sesos y no consigo encontrar el error.


                               

Juan Mellado

                                Hola Loopen,
puedes definir el parámetro Triangulo de dos formas:

1) Como LPDIRECT3DVERTEXBUFFER8 * Triangulo, en cuyo caso utilizas:
CreateVertexBuffer(..., Triangulo);
(*Triangulo)->Lock(...);
(*Triangulo)->Unlock(...);

2) Como LPDIRECT3DVERTEXBUFFER8 & Triangulo, en cuyo caso utilizas:
CreateVertexBuffer(..., &Triangulo);
Triangulo->Lock(...);
Triangulo->Unlock(...);

El primer método pasa el parámetro como un puntero a un puntero, el segundo pasa el parámetro por referencia.

Espero te sirva, saludos.                                

Loopen

                                Siiiiiiiiiiiii, menos mal que era eso, gracias Juan, y gracias a todos, ya se donde tengo un sitio con gente en la que confiar                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.