Récupérer une image du rendu 3D (Windows) ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Récupérer une image du rendu 3D (Windows) ?

Message par kelebrindae »

@cederavic:
Effectivement, ça marche! En passant "1" comme n° de buffer à "GrabSpriteEx", ça fonctionne! :D
Je ne sais pas comment j'avais fait mon test la dernière fois, parce que j'avais essayé de passer 1 et ça n'avait pas marché. C'était sur une autre machine, remarque...

Et chez toi, ça marche en passant "0" comme n° de buffer? Ce serait bizarre, parce que dans ce cas, "grabSpriteEx" fait un "StartDrawing(ScreenOutput())", qui plante systématiquement chez moi dès lors que j'ai fait un "initEngine3D"... ça ne marche peut-être pas partout pareil...

Peux-tu essayer mon code (dans mon premier post de ce thread) et me dire s'il marche chez toi ?

@Tous les autres:
Je poste le même code, modifié pour utiliser la procédure "GrabSpriteEx". Est-ce que ça marche chez vous?

Code : Tout sélectionner

; "GrabSprite" doesn't work after "RenderWorld" - Sample code
; March 05 2010
; PB v4.41, Windows XP SP2, GPU intel 82915G


Procedure.l GrabSpriteEx(sprite, buffer, x, y, width, height, mode=0)
  ; netmaestro 2007
  ; Grab a Sprite from the backbuffer or visible screen
  ; buffer values: 0=backbuffer, 1=visible screen
  If buffer
    srcDC = GetDC_(ScreenID())
  Else
    srcDC = StartDrawing(ScreenOutput())
  EndIf
  trgDC = CreateCompatibleDC_(srcDC)
  BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height)
  SelectObject_( trgDC, BMPHandle)
  BitBlt_( trgDC, 0, 0, Width, Height, srcDC, x, y, #SRCCOPY)
  DeleteDC_( trgDC)
  If buffer
    ReleaseDC_(ScreenID(), srcDC)
  Else
    StopDrawing()
  EndIf
  result = CreateSprite(sprite, width, height, mode)
  If sprite = #PB_Any
    output = result
  Else
    output = sprite
  EndIf
  StartDrawing(SpriteOutput(output))
    DrawImage(BMPHandle, 0, 0)
  StopDrawing()
  DeleteObject_(BMPHandle)
  ProcedureReturn output
EndProcedure  



;- Initialisation
If InitEngine3D() = 0
  MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 )
  End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 )
  End
EndIf

result = MessageRequester("GrabSprite & RenderWorld","Full Screen ?",#PB_MessageRequester_YesNo)
If result = 6     
  FullScreen=#True
  OpenScreen(800,600,32,"GrabSprite & RenderWorld")
Else           
  FullScreen=#False
  OpenWindow(0,0, 0, 800 , 600 ,"GrabSprite & RenderWorld",#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

;- Mesh
nummesh = CreateMesh(#PB_Any,100)
SetMeshData(nummesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?PlanVertices, 4)
SetMeshData(nummesh, #PB_Mesh_Face, ?PlanFaces, 2)

;- Material
Add3DArchive(".",#PB_3DArchive_FileSystem)

CreateImage(0,32,32)
StartDrawing(ImageOutput(0))
  Box(0, 0, ImageWidth(0), ImageHeight(0), $FFFFFF)
  Line(0,0,32,32,$0000FF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")

CreateMaterial(0,TextureID(0))

;- Entity
numEntity = CreateEntity(#PB_Any,MeshID(numMesh),MaterialID(0))
EntityLocate(numEntity,0,0,0)

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraBackColor(0,$FF0000)
MoveCamera(0,0,0,-5)
CameraLookAt(0,0,0,0)

;- Main loop
Repeat
  If fullscreen = #False
    While WindowEvent() : Wend
  EndIf
 
  ; Spin entity
  RotateEntity(numEntity,0,0,0.5,#PB_Relative)
 
  ; Render
  RenderWorld()
 
  ; Grab the screen's center in the sprite #0
  ;GrabSprite(0,400,300,32,32)      <= this doesn't work :(
  grabspriteex(0,1,400,300,32,32) ; <= this seems to work :) 

  ; Display sprite
  DisplaySprite(0,10,10)
 
  ; Flip buffers
  FlipBuffers()
 
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

End


;- data Section
DataSection

  PlanVertices:
  Data.f -0.5, -0.5, 0.0
  Data.f 1, 1, 1
  Data.f 0, 1
  Data.f 0.5, -0.5, 0.0
  Data.f 1,1,1
  Data.f 1, 1
  Data.f 0.5, 0.5, 0.0
  Data.f 1,1,1
  Data.f 1, 0
  Data.f -0.5, 0.5, 0.0
  Data.f 1,1,1
  Data.f 0,0
 
  PlanFaces:
  Data.w 2, 1, 0
  Data.w 0, 3, 2

EndDataSection 
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Récupérer une image du rendu 3D (Windows) ?

Message par venom »

voici chez moi le code compiler comme tel :
screenshot

après en fullscreen j'ai le même mise a part qu'il y a des caractères dans le carré blanc :?







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Récupérer une image du rendu 3D (Windows) ?

Message par kelebrindae »

Ouais, pareil chez moi, en fait: sur un autre PC, "GrabSpriteEx" ne fonctionne plus qu'en fullscreen; en mode fenêtré, le sprite est vide...
=> ça n'a pas l'air super stable, dommage. :(

Ce qu'il faudrait, c'est un moyen de récupérer le pointeur du backbuffer, afin de pouvoir manipuler l'image entre le "RenderWorld" et le "FlipBuffers". Mais ça, sans "StartDrawing(ScreenOutput())", ce n'est pas bien facile... :?
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Récupérer une image du rendu 3D (Windows) ?

Message par Backup »

chez moi le Grabsprite_ex marche en fenetré ET en Fullscreen !!

qu'est ce a dire , l'equipe de PB travaille sur une nouvelle version de GrabSprite ?

Carte Nvidia 7600 FX

[reedit]

ça marche aussi dans les 2 modes sur mon NC10 !!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Récupérer une image du rendu 3D (Windows) ?

Message par Backup »

tu en as parlé sur le Forum anglais ?

parceque ça ressemble bien a un bug

et d'ou tu sort cette procedure GrabspriteEX() ?? :)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Récupérer une image du rendu 3D (Windows) ?

Message par cederavic »

Effectivement j'ai tout un tas de bug avec les sprites et ogre aussi... La procedure je l'avais dejas recupe et mise en un include en l'ayant modifier. Mais si je change la position du sprite j'ai tout qui part en cauette... Un beu bordel 8O
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Récupérer une image du rendu 3D (Windows) ?

Message par Backup »

cederavic a écrit :Mais si je change la position du sprite j'ai tout qui part en cauette... Un beu bordel 8O
chez moi ce code fonctionne

grabsprite + mouvement du sprite generé

Code : Tout sélectionner

; "GrabSprite" doesn't work after "RenderWorld" - Sample code
; March 05 2010
; PB v4.41, Windows XP SP2, GPU intel 82915G


Procedure.l GrabSpriteEx(sprite, buffer, x, y, width, height, mode=0)
    ; netmaestro 2007
    ; Grab a Sprite from the backbuffer or visible screen
    ; buffer values: 0=backbuffer, 1=visible screen
    If buffer
        srcDC = GetDC_(ScreenID())
    Else
        srcDC = StartDrawing(ScreenOutput())
        EndIf
        trgDC = CreateCompatibleDC_(srcDC)
        BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height)
        SelectObject_( trgDC, BMPHandle)
        BitBlt_( trgDC, 0, 0, Width, Height, srcDC, x, y, #SRCCOPY)
        DeleteDC_( trgDC)
        If buffer
            ReleaseDC_(ScreenID(), srcDC)
        Else
        StopDrawing()
    EndIf
    result = CreateSprite(sprite, width, height, mode)
    If sprite = #PB_Any
        output = result
    Else
        output = sprite
    EndIf
    StartDrawing(SpriteOutput(output))
        DrawImage(BMPHandle, 0, 0)
    StopDrawing()
    DeleteObject_(BMPHandle)
    ProcedureReturn output
EndProcedure 



;- Initialisation
If InitEngine3D() = 0
    MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 )
    End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
    MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 )
    End
EndIf

result = MessageRequester("GrabSprite & RenderWorld","Full Screen ?",#PB_MessageRequester_YesNo)
If result = 6     
    FullScreen=#True
    OpenScreen(800,600,32,"GrabSprite & RenderWorld")
Else           
    FullScreen=#False
    OpenWindow(0,0, 0, 800 , 600 ,"GrabSprite & RenderWorld",#PB_Window_ScreenCentered)
    OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

;- Mesh
nummesh = CreateMesh(#PB_Any,100)
SetMeshData(nummesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?PlanVertices, 4)
SetMeshData(nummesh, #PB_Mesh_Face, ?PlanFaces, 2)

;- Material
Add3DArchive(".",#PB_3DArchive_FileSystem)

CreateImage(0,32,32)
StartDrawing(ImageOutput(0))
    Box(0, 0, ImageWidth(0), ImageHeight(0), $FFFFFF)
    Line(0,0,32,32,$0000FF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")

CreateMaterial(0,TextureID(0))

;- Entity
numEntity = CreateEntity(#PB_Any,MeshID(nummesh),MaterialID(0))
EntityLocate(numEntity,0,0,0)

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraBackColor(0,$FF0000)
MoveCamera(0,0,0,-5)
CameraLookAt(0,0,0,0)

;- Main loop
Repeat
    If FullScreen = #False
        While WindowEvent() : Wend
    EndIf
    
    ; Spin entity
    RotateEntity(numEntity,0,0,0.5,#PB_Relative)
    
    ; Render
    RenderWorld()
    
    ; Grab the screen's center in the sprite #0
    ;GrabSprite(0,400,300,32,32)      <= this doesn't work :(
    GrabSpriteEx(0,1,380,280,32,32) ; <= this seems to work :)
    
    x.f=x.f+0.5
    ; Display sprite
    DisplaySprite(0,x.f,10)
    
    ; Flip buffers
    FlipBuffers()
    
    ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

End


;- data Section
DataSection
    
    PlanVertices:
    Data.f -0.5, -0.5, 0.0
    Data.f 1, 1, 1
    Data.f 0, 1
    Data.f 0.5, -0.5, 0.0
    Data.f 1,1,1
    Data.f 1, 1
    Data.f 0.5, 0.5, 0.0
    Data.f 1,1,1
    Data.f 1, 0
    Data.f -0.5, 0.5, 0.0
    Data.f 1,1,1
    Data.f 0,0
    
    PlanFaces:
    Data.w 2, 1, 0
    Data.w 0, 3, 2
    
EndDataSection 
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Récupérer une image du rendu 3D (Windows) ?

Message par cederavic »

Essaye avec

Code : Tout sélectionner

GrabSpriteEx(0,1,0,0,800,600) 
:P
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Récupérer une image du rendu 3D (Windows) ?

Message par Backup »

marche en fenetré mais en plein ecran j'ai un carre noir !

mais pas de plantage :)

Fred s'en occupe de cette histoire ?
Répondre