Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: [EX3] en 06 de Enero de 2004, 05:26:42 AM

Título: Captura De Pantalla
Publicado por: [EX3] en 06 de Enero de 2004, 05:26:42 AM
 Weno, visto ke el modulo grafico de la dx_lib32 ya rinde bien a 4x de antialiasing en mi ekipo paso a otro problemilla ke no logro solucionar, la captura de pantalla. Como se realiza una captura de pantalla en D3D?

Salu2...
Título: Captura De Pantalla
Publicado por: [Over] en 06 de Enero de 2004, 09:55:37 AM
 Hola.



 IDirect3DSurface8* FrontBuffer;

 m_pD3DDevice->CreateImageSurface(ancho,alto, D3DFMT_A8R8G8B8, &FrontBuffer );  
 
 m_pD3DDevice->GetFrontBuffer(FrontBuffer));
 D3DXSaveSurfaceToFile(FileName,D3DXIFF_BMP,FrontBuffer, NULL, NULL);

   
RELEASE(FrontBuffer);


Supongo que habrá varias formas de hacerlo.

También puedes hacer capturas escalables, si te interesa dilo.

Chao.  
Título: Captura De Pantalla
Publicado por: [EX3] en 07 de Enero de 2004, 04:33:04 AM
 Lo del Getfrontbuffer() lo probe pero al crear la superficie lo hice con el metodo CreateTexture() y luego haciendo un puntero a la superficie de la textura, ya ke lo ke busco es guardarla en un array de texturas, pero sera posiblemente la razon por la ke no me funcionaba. Probare esto cuando pueda, gracias  ;)

Por cierto, a ke te refieres exactamente con captura escalables?
Y otra cuestion, el NULL de C++ a ke ekivale en VB??

Salu2...
Título: Captura De Pantalla
Publicado por: Loover en 07 de Enero de 2004, 09:43:58 AM
 #Define NULL 0
Título: Captura De Pantalla
Publicado por: [EX3] en 07 de Enero de 2004, 08:26:49 PM
 Loover, en VB algunas funciones no admiten ke le pases como parametro 0 o ByVal 0 si por ejemplo el parametro es de tipo RECT. Digo yo ke daria el mismo efecto si pasara una variable del tipo del parametro pero sin inicializar, no?

A ver [Over], el codigo ke me pasastes traducido a VB creo ke seria una cosa asi:
Citar'IDirect3DSurface8* FrontBuffer;
Dim FrontBuffer As Direct3DSurface8

'm_pD3DDevice->CreateImageSurface(ancho,alto, D3DFMT_A8R8G8B8, &FrontBuffer );
Set FrontBuffer = D3DDevice.CreateImageSurface(640, 480, D3DFMT_A8R8G8B8)

'm_pD3DDevice->GetFrontBuffer(FrontBuffer));
Call D3DDevice.GetFrontBuffer(FrontBuffer)

'D3DXSaveSurfaceToFile(FileName,D3DXIFF_BMP,FrontBuffer, NULL, NULL);
Dim NULL_PAL As PALETTEENTRY 'Variable sin inicializar para simular el NULL.
Dim NULL_RECT As RECT 'Variable sin inicializar para simular el NULL.
Call D3DX.SaveSurfaceToFile(App.Path & "\Captura.bmp", D3DXIFF_BMP, FrontBuffer, NULL_PAL, NULL_RECT)
   
'RELEASE(FrontBuffer); //Aqui me imagino que lo ke hareis sera borrar el contenido de la superficie, no?
Set FrontBuffer = Nothing
Tal y como lo tengo me da error al salvar la superficie en el disco. Puede tratarse de NULL_PAL y de NULL_RECT??

Salu2...
Título: Captura De Pantalla
Publicado por: jaure en 07 de Enero de 2004, 09:52:54 PM
 Hola

[EX3] Prueba con la constante, 'vbNullString'



A ver si funciona.

Ta luego.
Título: Captura De Pantalla
Publicado por: [EX3] en 07 de Enero de 2004, 10:10:23 PM
 vbNullString es equivalente a "" y solo se usa cuando el parametro es un String o cadena de texto, pero gracias por la ayuda  ;)

Salu2...
Título: Captura De Pantalla
Publicado por: Loover en 07 de Enero de 2004, 10:19:11 PM
 No sé en VB pero en c++ y programando con la dx9 NULL viene definido como cero. Con solo poner el cursor encima me lo dice porque tengo el visual assit.

Un saludo!
Título: Captura De Pantalla
Publicado por: jaure en 08 de Enero de 2004, 11:32:04 AM
 Hola

Para mi que esta función no es compatible con visual basic, o no la han querido hacer compatible, porque viendo su homóloga pero en dirección contraría es decir cargar una superficie de un fichero, la definición es esta.

object.LoadSurfaceFromFile( _
   DestSurface As Direct3DSurface8, _
   DestPalette As Any, _
   DestRect As Any, _
   SrcFile As String, _
   SrcRect As Any, _
   Filter As Long, _
   ColorKey As Long, _
   SrcInfo)


Si te fijas los parametros Rect, y de Paleta estan como tipo de datos Any, al cual si que se le puede pasar un 'ByVal 0', para emular el null de C.

En cambio la función SaveSurfaceToFile, no han creado una función para compatibilizar los valores NULL, es decir es la misma que la de C, con lo cual creo que habrá que dar valores al parametro PALETTEENTRY, y RECT, imposibilitando que sean nulos.
Si te das cuenta en la documentación de esta función para VB, ni siquiera aparece, por lo menos en mi fichero de ayuda del SDK para VB.

Estos de microsoft, ya que se ponen podrían terminar bien el trabajo, y no dejarnos a medias. O todo DirectX, para VB o nada, pero no que encima estemos viendo si han implementado función a función.


Ta luego, es un placer intentar ayudar en algo con mis pocos conocimientos de DirectX  :)
Título: Captura De Pantalla
Publicado por: BeRSeRKeR en 08 de Enero de 2004, 02:18:24 PM
 A esa función, efectivamente no puedes dejar esos dos parámetros a NULL pero puedes pasarle sin problemas una paleta sin inicializar. Aquí tienes un ejemplo de cómo capturar el front buffer y guardarlo en un archivo. No sé si hará lo que quieres. Supongo que sí.

Saludos.
Título: Captura De Pantalla
Publicado por: jaure en 08 de Enero de 2004, 05:03:46 PM
 Pos tienes razon la paleta no hace falta inicializarla, pero la estructura RECT si, sería esto lo que le daba el error en el ejemplo anterior que declaraba un Rect sin dar dimensiones.

Ta luego.
Título: Captura De Pantalla
Publicado por: [EX3] en 09 de Enero de 2004, 05:47:57 PM
 Gracias por el codigo, BeRSeRKeR. He probado el codigo del ejemplo que me has pasado y funciona perfectamente menos por un detalle un tanto peculiar. En pantalla completa lo realiza sin problemas pero en modo ventana realiza una captura completa de la pantalla, no solo de la ventana. Se puede solucionar esto ultimo a traves de d3d o hay que andar modificando los valores de la variable de tipo RECT??

jaure, por muy burros ke sean los de Microsoft (por ke en ciertas cosas lo son) no creo ke sean tan cazurros como para pasar una funcion de C++ a VB sin ke esta sea compatible.

Salu2...
Título: Captura De Pantalla
Publicado por: [EX3] en 09 de Enero de 2004, 06:35:32 PM
 jaure: dijo:
CitarSi te das cuenta en la documentación de esta función para VB, ni siquiera aparece, por lo menos en mi fichero de ayuda del SDK para VB.

Estos de microsoft, ya que se ponen podrían terminar bien el trabajo, y no dejarnos a medias. O todo DirectX, para VB o nada, pero no que encima estemos viendo si han implementado función a función.
Ahi te doy toda la razon, el SDK para VB esta muy incompleto en cuanto a informacion y tb en ke algunos tutoriales del C++ ni se han molestado en pasarlos a VB.

Salu2...