Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con el Formato Surface D3D.

Iniciado por Degiik, 21 de Septiembre de 2006, 12:55:17 PM

« anterior - próximo »

Degiik

Hola, estoy intentando acceder al BackBuffer para poder tener un puntero de memoria para despues jugar con el, por ejemplo, para tomar un screenshot.

En la creación del device establezco ARGB-32bits i permito bloquear el back buffer...

d3dPP.Flags|=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

Despues de renderizar uso...

hr=p3DDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&lpSurface);
hr=lpSurface->LockRect(&LockedRect, NULL, D3DLOCK_READONLY);

i resulta q LockedRect.pBits no tiene el puntero a memoria local q espero con el ARGB 32 bits... despues de darle vueltas i depurando, veo que lpSurface me parece con D3DFMT_UNKNOWN despues de llamar a GetBackBuffer.

Como he de hacer para que la Surface tenga el formato que espero ( D3DFMT_A8R8G8B8) ? Alguna idea ? commentario ? ayuda ?

----------


También intente obtener la misma información pero del FrontBuffer, usando GetFrontBufferData de la siguiente forma:

hr=p3DDev->CreateOffscreenPlainSurface(lWidth,lHeight,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&lpSurface,NULL);
//hr=p3DDev->CreateRenderTarget(1280,1024,D3DFMT_A8R8G8B8,D3DMULTISAMPLE_NONE,0,TRUE,&lpSurface,NULL);
hr=p3DDev->GetFrontBufferData(0,lpSurface);
hr=lpSurface->LockRect(&LockedRect, NULL, D3DLOCK_READONLY);

Pero en la llamada a GetFrontBufferData hr tiene valor de error. ( D3DERR_INVALIDCALL creo recordar )

:cry:  :cry:  :cry:

Alguien me puede echar un cable con alguna de las dos alternatvas ? si puedo elegir, la mas rápida, claro...

Gracias de antemano.
egiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

[EX3]

Mira a ver si te orienta algo este codigo aun siendo Visual Basic:
Citar'===============================================================================
' Name: SURF_ScreenCapture
' Input:
' Output:
'   Long - Devuelve el identificador de la superficie en memoria donde esta almacenada la captura.
' Purpose: Genera una captura del buffer de pantalla.
' Remarks: La función genera automáticamente una superficie nueva en memoria para almacenar la captura. En modo ventana solo se realiza la captura del área de cliente de la ventana, sin los bordes ni la barra de titulo de la ventana.
'===============================================================================

Public Function SURF_ScreenCapture() As Long
On Error GoTo ErrOut

Dim oSurface As Direct3DSurface8
Dim Pal As PALETTEENTRY
Dim SrcRect As RECT
Dim DispMode As D3DDISPLAYMODE
Dim ClientRect As POINTAPI

Dim Surf As Long

If D3D_Init Then
'Creamos la superficie donde almacenaremos la captura:
Surf=SURF_Create(D3DWindow.BackBufferWidth, D3DWindow.BackBufferHeight)

If Surf >= 0 Then
If Not Windowed Then
'Leemos el contenido de la pantalla (FrontBuffer) y lo guardamos en la superficie:
D3DDevice.GetFrontBuffer Surface(Surf).Surface

Else
'Obtenemos las dimensiones de la resolución de pantalla
del adaptador:
D3DDevice.GetDisplayMode DispMode

'Creamos una superficie con la resolución seleccionada del adaptador grafico a
'32 Bit de][color por que la función siempre devuelve el resultado a 32 Bits (D3DFMT_A8R8G8B8):

Set oSurface=D3DDevice.CreateImageSurface(DispMode.Width, _
DispMode.Height, _
D3DFMT_A8R8G8B8)

'Leemos el contenido de la pantalla (FrontBuffer) y lo guardamos en la superficie:
Call D3DDevice.GetFrontBuffer(oSurface)

'En modo ventana la captura es de toda la pantalla, escritorio incluido, así que calculamos
'la posición y las dimensiones del área de cliente de la ventana donde dibujamos para salvar
'unicamente el contenido del programa:

Call GetClientRect(Me.hwnd, SrcRect)
Call ClientToScreen(Me.hwnd, ClientRect)

With SrcRect
.Left=ClientRect.X
.Right=.Left + .Right
.Top=ClientRect.Y
.bottom=.Top + .bottom
End With

'Copiamos la seccion de captura del programa a la superficie en memoria:
Call D3DX.LoadSurfaceFromSurface(Surface(Surf).Surface,
Pal, ByVal 0, oSurface, Pal, SrcRect, D3DX_DEFAULT, 0)

End If

SURF_ScreenCapture=Surf
Exit Function

End If

End If

ErrOut:
SURF_ScreenCapture=-1
End Function
Yo la captura la realizo del FrontBuffer en vez del BackBuffer. Por alguna causa que ya no recuerdo creo que el BackBuffer siempre me devolvia una superficie vacia.

Salu2...

P.D.: Alguien conoce alguna herramienta web para coloreado automatico de sintaxis de codigo fuente a BBCode que no sea editando html desde un editor y convirtiendolo a BBCode con esta herramienta?
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.