Page 2 sur 2

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

Publié : ven. 05/mars/2010 21:18
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 

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

Publié : ven. 05/mars/2010 22:04
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 :?







@++

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

Publié : ven. 05/mars/2010 22:13
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... :?

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

Publié : ven. 05/mars/2010 22:25
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 !!

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

Publié : sam. 06/mars/2010 8:50
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() ?? :)

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

Publié : sam. 06/mars/2010 10:17
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

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

Publié : sam. 06/mars/2010 11:23
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 

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

Publié : sam. 06/mars/2010 11:37
par cederavic
Essaye avec

Code : Tout sélectionner

GrabSpriteEx(0,1,0,0,800,600) 
:P

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

Publié : sam. 06/mars/2010 13:54
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 ?