Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Crear texto en Direct3d

Iniciado por mbike, 02 de Enero de 2003, 11:52:03 PM

« anterior - próximo »

mbike

                                Wenas, alguien me podria decir como crear texto con direct3d?? o algun sitio donde lo diga, e encontrado sitios con ayuda pero no me va, se me kda colgao, no se si sera x la targeta grafica....(voddoo 3).

Gracias :D                                

BeRSeRKeR

                                Si tienes la SDK de DX, con el framework viene una clase para escribir texto. El archivo en cuestion es d3dfont.h y d3dfont.cpp.

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

x-alien

                                hola aki te pongo k tienes k hacer paso a paso para poder poner texto



// declaramos nuestra interface para texto

ID3DXFont *g_font=NULL;





void ConstruyeFuente(){

HRESULT hr;



// nuestra estructura LOGFONT define la fuente que estamos solicitando

// Algunos de estos parametros son opcionales, y se pueden usar los defaults, mira los

// docs de tu SDK para mas informacion

LOGFONT log_font={

  30, //alto (TAMAÑO)

  0,  //ancho; 0 = proporcional al alto

  0,  // lfEscapement;

  0,  // Orientación;

  FW_BOLD, // peso, grosor;

  FALSE, // es italica?

  TRUE, // es subrayado?

  FALSE, // es TACHADO?

  DEFAULT_CHARSET, // Set de caracteres;

  OUT_DEFAULT_PRECIS, // Precision;

  CLIP_DEFAULT_PRECIS, // Precision de clipping;

  ANTIALIASED_QUALITY,// calidad;

  DEFAULT_PITCH,// pitch;

  "Times"// nombre de la fuente

  };



  // Esto es todo lo que tenemos que hacer para crear la fuente. bastante facil no?

  hr=D3DXCreateFontIndirect(obj_dispositivo_D3D,&log_font,&g_font);



  if(FAILED(hr)){

     Error_Fatal("Error al crear la fuente");

  }

}




en tu funcion de render escribe...char buffer[30]; RECT RectanguloParaDibujo={0,0,800,600};(esto antes de beginscene como es logico =) luego este codigo despues del beginscene, puedes hacerte tus clases para k sea mas comodo todo esto =)


     g_font->Begin();



     // cambiamos la posicion de donde queremos colocar el texto.

     RectanguloParaDibujo.top=50; //posicion en Y

  RectanguloParaDibujo.left=200; //posicion en X



     g_font->DrawText(buffer,     // Esta es la variable string(texto) que vamos a dibujar

                      -1,         // Este es la longitud del texto, -1 indica que la cadena

                   // esta terminada en NULL, asi que la longitud es calculada automaticamente.

                      &RectanguloParaDibujo, // Nuestro rectangulo, usado para posicionar el texto

                      DT_LEFT,    // Nuestras banderas. Esto significa que el texto estará

                   // justificado a la izquierda. Mira la documentacion para mas información.

                      D3DCOLOR_ARGB(255,255,255,255));// Este es nuestro color de renderización. Nota que la componente Alpha

          // es 255, esto hace que el color sea opaco y no transparente, si disminuyes

          // este valor ira incrementando la transparencia, ve provando para que veas

          // efectos muy buenos.



     RectanguloParaDibujo.top=150;

    RectanguloParaDibujo.left=50;





     RectanguloParaDibujo.top=200;

     g_font->DrawText("DirectX 8.0 es lo mejor en graficos",-1,&RectanguloParaDibujo,DT_LEFT,D3DCOLOR_ARGB(255,0,0,255));



     RectanguloParaDibujo.top=250;

     g_font->DrawText("Este es un texto hecho por Direct3D",-1,&RectanguloParaDibujo,DT_LEFT,D3DCOLOR_ARGB(255,255,0,0));



  RectanguloParaDibujo.top = posicionY; // Nota que la posicion en Y de esta linea es variable...

     RectanguloParaDibujo.left=100;

     g_font->DrawText("Hola mundo, esto es una prueba de texto!",-1,&RectanguloParaDibujo,DT_LEFT,D3DCOLOR_ARGB(100,255,255,255));



     // Notificamos que hemos terminado de renderizar todo el texto que queremos, y ahora

  // D3D se encargara de el resto.

     g_font->End();


ah lo mas importante xd.. k no se te olvide limpiar!!
void LiberaFuente(){



  if(g_font){

     g_font->Release();

     g_font=NULL;

  }



}


ojala todo el mundo respondiera como yo =), asi aprenderiamos mas =)
el codigo es de una antigua demo k hice, la cual estoy portando a dx9.
si eres nuevo en esto de la programacion, el d3dfont te puede resultar lioso como todo lo k genera el appwizard del dx, por lo menos ami k llevo meses en esto de la programacion =).

salu2

pd. ahi otra forma mas rapida de usar texto y es mejor para la memoria, usando un tga con las fuentes, eso es ya algo mas complejo k esto, si alguien puede explicarlo k lo explike podria ayudar =). yo actualmente estoy intentado hacer fuentes con el tga de fuentes del quake3 =)


pdd. en RECT RectanguloParaDibujo={0,0,800,600}; puedes asignar una macro #define WND_ANCHO 800 #define WND_ALTO 600 y lo reemplazas por el {0,0,800,600};  el top y el botton aki son despreciables, no hacen falta =)                                
oy Grafista, no Programador, aun así programo mejor que un 'programador'

BeRSeRKeR

                                En el tutorial nº 7 que escribí hace tiempo viene una clase que permite dibujar texto (utiliza la fuente de quake3 precisamente)

Podéis descargar el código desde aquí:
http://www.arrakis.es/~jonathan01/programm...g/D3D8/tut7.htm

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

fiero

                                Si quieres algo fácil, tambien puedes utilizar las funciones del GDI de windows para escribir texto con DX9, de la siguiente manera:

- Obtienes un HDC con IDirect3DSurface9::GetDC ()
- Escribes texto con la función TextOut de la GDI de windows:
TextOut(HDC hdc,// handle to device context
 int nXStart,       // x-coordinate of starting position
 int nYStart,       // y-coordinate of starting position
 LPCTSTR lpString,  // pointer to string
 int cbString       // number of characters in string
);

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

x-alien

                                he leido por ahi k no es aconsejable mezclar la gdi con directx, pues desfavorece el rendimiento, no se si es cierto pero mi experiencia esk si abuso de bitblt para transparencias chupa mucha memoria y produce leaks de memoria en win98. claro k para corregir ese error de win98 es mejor crearse uno mismo su sistema de transparencia.. pero la gdi siempre sera lentorra. si el directx tiene herramientas para poner texto es una tonteria usar la gdi, pork desfavoreceria el rendimiento.

en dx hay varias formas de poner texto, esta k he puesto, chupa mas rendimiento, es la mas basica, hay otras mas complejas k son las de los tgas, las cuales chupan menos memoria. pero claro hay muchas formas de hacer las cosas para k vaya super rapido lo k programes.

salu2                                
oy Grafista, no Programador, aun así programo mejor que un 'programador'






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.