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...
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.
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...
#Define NULL 0
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...
Hola
[EX3] Prueba con la constante, 'vbNullString'
A ver si funciona.
Ta luego.
vbNullString es equivalente a "" y solo se usa cuando el parametro es un String o cadena de texto, pero gracias por la ayuda ;)
Salu2...
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!
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 :)
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.
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.
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...
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...