Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: mbike en 02 de Enero de 2003, 11:52:03 PM

Título: Crear texto en Direct3d
Publicado por: mbike en 02 de Enero de 2003, 11:52:03 PM
                                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                                
Título: Crear texto en Direct3d
Publicado por: BeRSeRKeR en 03 de Enero de 2003, 12:15:29 AM
                                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                                
Título: Crear texto en Direct3d
Publicado por: x-alien en 06 de Enero de 2003, 04:02:30 AM
                                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 =)                                
Título: Crear texto en Direct3d
Publicado por: BeRSeRKeR en 06 de Enero de 2003, 04:10:48 AM
                                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                                
Título: Crear texto en Direct3d
Publicado por: fiero en 06 de Enero de 2003, 08:16:55 AM
                                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                                
Título: Crear texto en Direct3d
Publicado por: x-alien en 07 de Enero de 2003, 12:25:43 AM
                                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