Post

 Resources 

Console


Re: Saving Rendered Scene as Bitmap Sylvain Dupont (0 replies, 0 views) (2001-Mar-24)
-
This is a code to "take a screenshot" of the current Backbuffer scene in DirectX8 : I know it's quite hard but it's working. '////////////////////////////////////////////////////// ' SCREEN SHOT CODE FROM TRUEVISION8 ENGINE '////////////////////////////////////////////////////// Public Type BITMAPINFOHEADER '40 bytes biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type Public Type BITMAPHEADER magic As Integer Size As Long Reserved As Integer Reserved2 As Integer offset As Long End Type Public Type BITMAPHEADER2 magic As Integer Size1 As Integer Size2 As Integer Reserved As Integer Reserved2 As Integer offset As Integer offset2 As Integer End Type Sub ScreenShot(file As String) 'Take a screen shot of the current scene Dim Surface As Direct3DSurface8, Surf2 As Direct3DSurface8 Dim Data() As Byte Set Surface = Device.GetBackbuffer(0, D3DBACKBUFFER_TYPE_MONO) Dim w As Long, h As Long Dim Desc As D3DSURFACE_DESC Surface.GetDesc Desc Set Surf2 = Device.CreateImageSurface(Desc.width, Desc.height, Desc.Format) Device.CopyRects Surface, ByVal 0, 0, Surf2, ByVal 0 Surf2.GetDesc Desc ReDim Preserve Data(Desc.Size) As Byte Dim RECT As D3DLOCKED_RECT Surf2.LockRect RECT, ByVal 0, 0 DXCopyMemory Data(0), ByVal RECT.pBits, Desc.Size Surf2.UnlockRect Dim MemoryCount As Long, y As Long, temp As Byte Dim data2() As Byte ReDim data2(Desc.Size) As Byte For y = 0 To Desc.height - 1 DXCopyMemory data2(y * RECT.Pitch), Data((Desc.height - y - 1) * RECT.Pitch), RECT.Pitch Next y Dim offset As Long, offset2 As Long offset = 0 offset2 = 0 If Desc.Format = D3DFMT_R5G6B5 Then '16bits modes ReDim Data3(Desc.Size * 3 / 2) As Byte For i = 0 To Desc.Size / 2 - 1 Data3(offset + 2) = data2(offset2 + 1) And &HF8 Data3(offset + 1) = (data2(offset2 + 1) And &H7) * 32 + (data2(offset2) And &HE0) \ 8 Data3(offset + 0) = (data2(offset2) And &H1F) * 8 offset = offset + 3 offset2 = offset2 + 2 Next i Else '32bits modes, alpha is unsignifiant ReDim Data3(Desc.Size * 3 / 4) As Byte For i = 0 To Desc.Size / 4 - 1 Data3(offset + 2) = data2(offset2 + 1) Data3(offset + 1) = data2(offset2 + 2) Data3(offset + 0) = data2(offset2 + 3) offset = offset + 3 offset2 = offset2 + 4 Next i End If MemoryCount = UBound(Data3) + 54 Dim bm As BITMAPHEADER Dim bm2 As BITMAPINFOHEADER bm.magic = 19778 bm.Size = MemoryCount bm.offset = 54 bm2.biBitCount = 24 bm2.biWidth = Desc.width bm2.biHeight = Desc.height bm2.biSize = 40 bm2.biPlanes = 1 bm2.biSizeImage = MemoryCount - 54 bm2.biCompression = 0 bm2.biXPelsPerMeter = 50 bm2.biYPelsPerMeter = 50 Close 1 Open file For Binary As 1 Put #1, , bm Put #1, , bm2 Put #1, , Data3() Close 'End If Erase Data() Set Surface = Nothing End Sub Hope this helps Regards Sylvain TrueVision8 programmer.


-
Up One Level | Back to Forum


Copyright © 2002 - 2004 Eric Coleman, Peter Kuchnio , et. al.
There have been 30 visitors within the last 20 minutes
RSS News Feed