[opengl]Comment faire du 2d en opengl??

Comment faire du 2d en opengl?? [opengl] - Programmation

Marsh Posté le 06-06-2001 à 11:35:47    

ouais je cherche à faire des trucs simple en 2d sous opengl, mais je sais pas comment m'y prendre. Du style comment faire un effet de feu sur un ecran.

Reply

Marsh Posté le 06-06-2001 à 11:35:47   

Reply

Marsh Posté le 06-06-2001 à 12:01:36    

si tu fais ça sous unix, j'ai vu des trucs sympa avec la lib allegro

Reply

Marsh Posté le 06-06-2001 à 13:02:28    

ben il existe quelques fonction opengl qui sont capables de travailler en 2d, mais dans ce cas le mieux est peut etre de faire les effets toi meme, tu initialise l'écran soit avec Win32 ou DirectDraw et ensuite tu te debrouille pour faire tes effets toi meme.

Reply

Marsh Posté le 06-06-2001 à 14:37:03    

t'aurai pas un petit exemple darkoli stp??
pasque je devrai arrivé à initialiser mais après je vois pas comment afficher quelque chose qui soit autre chose qu'une image.

Reply

Marsh Posté le 06-06-2001 à 17:23:26    

ben tu peux par exemple afficher des lignes et des points !!! (glLines et glPoints), mais sinon tu ne peux pas vraiement faire grand chose en 2d quand tu veux faire comme toi un effet de feu car dans ce cas, il faut pouvoir acceder directement aux pixels de l'image (ou du buffer avant affichage).
 
je regarde pour l'exemple, il faut que je cherche

Reply

Marsh Posté le 07-06-2001 à 09:41:14    

oki merci, c'est bien ce qui me semblait pour l'accès à la mémoire, c'est pas trop possible en opengl, le truc, c'est qu'on doit bien pouvoir creer une zone mémoire, à l'identique d'une zone d'écran, et la convertir en texture, pour l'afficher sur un polygone. Le sul truc qui me tracasse c'est comment faire pour savoir exactement la coordonné des points par rapport à l'ecran.
Bon j'attend ton exemple avec impatience

Reply

Marsh Posté le 07-06-2001 à 14:48:31    

nan toujours pas trouvé?

Reply

Marsh Posté le 07-06-2001 à 17:01:56    

darkoli, tu veux pas m'aider????

Reply

Marsh Posté le 07-06-2001 à 22:53:37    

nan en fait personne ne veux m'aider????

Reply

Marsh Posté le 08-06-2001 à 09:39:19    

ben je peux te poster un exemple ce soir avec un truc qui affiche des image dans Opengl, mais le probleme c'est que ce ne sera pas tres rapide !!!
 
j'avais un exemple qui affichait un effet de plasma à l'aide de DirectX et en Assembleur32 qui est pas mal et que tu pourrais recuperer, je le cherche (j'etais en congé jeudi).

Reply

Marsh Posté le 08-06-2001 à 09:39:19   

Reply

Marsh Posté le 08-06-2001 à 09:58:12    

je suis desolé kick mais c'est de l'assembleur :

Code :
  1. ;---------------------------------------;
  2. ; DDRAW Plasma Demo  ;
  3. ;     ;
  4. ; Author : X-Calibre ;
  5. ; ASM version : Ewald Snel ;
  6. ; Copyright (C) 1999, Diamond Crew;
  7. ;     ;
  8. ; http://here.is/diamond/  ;
  9. ;---------------------------------------;
  10. ;*) view/edit with tabsize = 4
  11. TITLE WIN32ASM EXAMPLE
  12. .386
  13. .MODEL FLAT, STDCALL
  14. ;-----------------------------------------------------------;
  15. ;    WIN32ASM / DDRAW PLASMA DEMO    ;
  16. ;-----------------------------------------------------------;
  17. INCLUDE windows.inc
  18. INCLUDE ddraw.inc
  19. INCLUDE gdi32.inc
  20. INCLUDE kernel32.inc
  21. INCLUDE user32.inc
  22.  WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
  23.  WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
  24. RETURN MACRO arg
  25. IFNB <arg>
  26.  mov   eax, arg
  27. ENDIF
  28. ret
  29. ENDM
  30. LRETURN MACRO arg
  31. IFNB <arg>
  32.  mov   eax, arg
  33. ENDIF
  34. leave
  35. ret
  36. ENDM
  37. FATAL MACRO msg
  38. LOCAL @@msg
  39. .DATA
  40. @@msg  db  msg, 0
  41. .CODE
  42. INVOKE MessageBox, hWnd, ADDR @@msg, ADDR szDisplayName, MB_OK
  43. INVOKE ExitProcess, 0
  44. ENDM
  45. .DATA?
  46. palette   dd  256 dup (?)
  47. table   dd  512 dup (?)
  48. .DATA
  49. ddwidth   EQU  320    ; display mode width
  50. ddheight  EQU  200    ; display mode height
  51. phaseA   dd  0
  52. phaseB   dd  0
  53. factor1   EQU  -2
  54. factor2   EQU  -1
  55. factor3   EQU   1
  56. factor4   EQU  -2
  57. red    dd  500.0
  58. green   dd  320.0
  59. blue   dd  372.0
  60. scale1   dd  2.0
  61. scale2   dd  128.0
  62. scale3   dd  256.0
  63. scale4   dd  127.0
  64. szClassName  db   "DDRAW Plasma Demo", 0 ; class name
  65. szDisplayName EQU   <szClassName>   ; window name
  66. color   dd   0
  67. wc    WNDCLASSEX < SIZEOF WNDCLASSEX, CS_HREDRAW OR CS_VREDRAW, OFFSET WndProc, 0, 0, , 0, 0, , 0, OFFSET szClassName, 0 >
  68. hWnd   HWND    ?  ; surface window
  69. lpDD   LPDIRECTDRAW  ?  ; DDraw object
  70. lpDDSPrimary LPDIRECTDRAWSURFACE ?  ; DDraw primary surface
  71. ddsd   DDSURFACEDESC  <?>  ; DDraw surface descriptor
  72. ddscaps   DDSCAPS    <?>  ; DDraw capabilities
  73. .CODE
  74. start:
  75. INVOKE GetModuleHandle, NULL
  76. INVOKE WinMain, eax, NULL, NULL, SW_SHOWDEFAULT
  77. INVOKE ExitProcess, eax
  78. ;-----------------------------------------------------------;
  79. ;    Calculate Next Plasma Frame     ;
  80. ;-----------------------------------------------------------;
  81. nextFrame PROC
  82. push  ebx
  83. push  esi
  84. push  edi
  85. mov   ecx , ddheight    ; # of scanlines
  86. mov   edi , [ddsd.lpSurface]  ; pixel output
  87. @@scanline:
  88. push  ecx
  89. push  edi
  90. mov   esi , [phaseA]
  91. mov   edx , [phaseB]
  92. sub   esi , ecx
  93. and   edx , 0ffH
  94. and   esi , 0ffH
  95. mov   edx , [table][4*edx][256*4]
  96. mov   esi , [table][4*esi]  ; [x]  +  table0[a + y]
  97. sub   edx , ecx     ; [y]  +  table1[b]
  98. mov   ecx , ddwidth    ; [x] --> pixel counter
  99. @@pixel:
  100. and   esi , 0ffH
  101. and   edx , 0ffH
  102. mov   eax , [table][4*esi]
  103. mov   ebx , [table][4*edx][256*4]
  104. add   eax , ebx
  105. add   esi , factor3
  106. shr   eax , 1
  107. add   edx , factor4
  108. and   eax , 0ffH
  109. add   edi , 4
  110. mov   eax , [palette][4*eax]
  111. dec   ecx
  112. mov   [edi][-4] , eax
  113. jnz   @@pixel
  114. pop   edi
  115. pop   ecx
  116. add   edi , [ddsd.lPitch]   ; inc. display position
  117. dec   ecx
  118. jnz   @@scanline
  119. add   [phaseA] , factor1
  120. add   [phaseB] , factor2
  121. pop   edi
  122. pop   esi
  123. pop   ebx
  124. ret
  125. nextFrame ENDP
  126. ;-----------------------------------------------------------;
  127. ;    Initalize Plasma Tables      ;
  128. ;-----------------------------------------------------------;
  129. initPlasma PROC
  130. LOCAL @@i :DWORD
  131. LOCAL @@r :DWORD
  132. LOCAL @@g :DWORD
  133. LOCAL @@b :DWORD
  134. LOCAL temp :DWORD
  135. mov   [@@i] , 0
  136. .WHILE @@i < 256
  137.  mov   edx , [@@i]
  138. ; Calculate table0 value
  139.  fldpi
  140.  fimul  DWORD PTR [@@i]
  141.  fmul  REAL4 PTR [scale1]
  142.  fdiv  REAL4 PTR [scale3]
  143.  fsin
  144.  fmul  REAL4 PTR [scale4]
  145.  fadd  REAL4 PTR [scale2]
  146.  fistp  DWORD PTR [table][4*edx]
  147. ; Calculate table1 value
  148.  fldpi
  149.  fimul  DWORD PTR [@@i]
  150.  fmul  REAL4 PTR [scale1]
  151.  fdiv  REAL4 PTR [scale3]
  152.  fcos
  153.  fmul  REAL4 PTR [scale2]
  154.  fadd  REAL4 PTR [scale2]
  155.  fldpi
  156.  fmulp  st(1), st
  157.  fmul  REAL4 PTR [scale1]
  158.  fdiv  REAL4 PTR [scale3]
  159.  fsin
  160.  fmul  REAL4 PTR [scale4]
  161.  fadd  REAL4 PTR [scale2]
  162.  fistp  DWORD PTR [table][4*edx][4*256]
  163. ; Calculate palette value
  164.  xor   eax , eax
  165.  FOR comp, <red, green, blue>
  166.   fldpi
  167.   fimul  DWORD PTR [@@i]
  168.   fmul  REAL4 PTR [scale1]
  169.   fdiv  REAL4 PTR [comp]
  170.   fcos
  171.   fmul  REAL4 PTR [scale4]
  172.   fadd  REAL4 PTR [scale2]
  173.   fistp  DWORD PTR [temp]
  174.   shl   eax , 8
  175.   or   eax , [temp]
  176.  ENDM
  177.  mov   [palette][4*edx] , eax
  178.  inc   [@@i]
  179. .ENDW
  180. ret
  181. initPlasma ENDP
  182. ;-----------------------------------------------------------;
  183. ;    WinMain  ( entry point )     ;
  184. ;-----------------------------------------------------------;
  185. WinMain PROC hInst     :DWORD,
  186.    hPrevInst :DWORD,
  187.    CmdLine   :DWORD,
  188.    CmdShow   :DWORD
  189. LOCAL msg  :MSG
  190. ; Fill WNDCLASSEX structure with required variables
  191. mov   eax , [hInst]
  192. mov   [wc.hInstance] , eax
  193. push  BLACK_BRUSH
  194. call  GetStockObject
  195. mov   [wc.hbrBackground] , eax
  196. INVOKE RegisterClassEx, ADDR wc
  197. ; Create window at following size
  198. INVOKE CreateWindowEx, 0,
  199.                             ADDR szClassName,
  200.                             ADDR szDisplayName,
  201.                             WS_POPUP,
  202.                             0, 0, ddwidth, ddheight,
  203.                             NULL, NULL,
  204.                             hInst, NULL
  205. mov   [hWnd] , eax
  206. INVOKE ShowWindow, hWnd, SW_SHOWNORMAL
  207. INVOKE SetFocus, hWnd
  208. INVOKE ShowCursor, 0
  209. ; Initialize display
  210. INVOKE DirectDrawCreate, NULL, ADDR lpDD, NULL
  211. .IF eax != DD_OK
  212.  FATAL "Couldn't init DirectDraw"
  213. .ENDIF
  214. DDINVOKE SetCooperativeLevel, lpDD, hWnd, DDSCL_EXCLUSIVE OR DDSCL_FULLSCREEN
  215. .IF eax != DD_OK
  216.  FATAL "Couldn't set DirectDraw cooperative level"
  217. .ENDIF
  218. DDINVOKE SetDisplayMode, lpDD, ddwidth, ddheight, 32
  219. .IF eax != DD_OK
  220.  FATAL "Couldn't set display mode"
  221. .ENDIF
  222. mov   [ddsd.dwSize] , SIZEOF DDSURFACEDESC
  223. mov   [ddsd.dwFlags] , DDSD_CAPS
  224. mov   [ddsd.ddsCaps.dwCaps] , DDSCAPS_PRIMARYSURFACE
  225. DDINVOKE CreateSurface, lpDD, ADDR ddsd, ADDR lpDDSPrimary, NULL
  226. .IF eax != DD_OK
  227. FATAL "Couldn't create primary surface"
  228. .ENDIF
  229. call  initPlasma
  230. ; Loop until PostQuitMessage is sent
  231. .WHILE 1
  232.  INVOKE PeekMessage, ADDR msg, NULL, 0, 0, PM_REMOVE
  233.  .IF eax != 0
  234.   .IF msg.message == WM_QUIT
  235.    INVOKE PostQuitMessage, msg.wParam
  236.    .BREAK
  237.   .ELSE
  238.    INVOKE TranslateMessage, ADDR msg
  239.                 INVOKE DispatchMessage, ADDR msg
  240.   .ENDIF
  241.  .ELSE
  242.   INVOKE GetFocus
  243.   .IF eax == hWnd
  244.    mov   [ddsd.dwSize] , SIZEOF DDSURFACEDESC
  245.    mov   [ddsd.dwFlags] , DDSD_PITCH
  246.    .WHILE 1
  247.     DDSINVOKE mLock, lpDDSPrimary, NULL, ADDR ddsd, DDLOCK_WAIT, NULL
  248.     .BREAK .IF eax == DD_OK
  249.     .IF eax == DDERR_SURFACELOST
  250.      DDSINVOKE Restore, lpDDSPrimary
  251.     .ELSE
  252.      FATAL "Couldn't lock surface"
  253.     .ENDIF
  254.    .ENDW
  255.    DDINVOKE WaitForVerticalBlank, lpDD, DDWAITVB_BLOCKBEGIN, NULL
  256.    call  nextFrame
  257.    DDSINVOKE Unlock, lpDDSPrimary, ddsd.lpSurface
  258.   .ENDIF
  259.  .ENDIF
  260. .ENDW
  261.     .IF lpDD != NULL
  262.     .IF lpDDSPrimary != NULL
  263.             DDSINVOKE Release, lpDDSPrimary
  264.             mov   [lpDDSPrimary] , NULL
  265.  .ENDIF
  266.   DDINVOKE Release, lpDD
  267.      mov   [lpDD] , NULL
  268. .ENDIF
  269. LRETURN msg.wParam
  270. WinMain ENDP
  271. ;-----------------------------------------------------------;
  272. ;    Window Proc  ( handle events )    ;
  273. ;-----------------------------------------------------------;
  274. WndProc PROC hWin   :DWORD,
  275.              uMsg   :DWORD,
  276.              wParam :DWORD,
  277.              lParam :DWORD
  278. .IF uMsg == WM_KEYDOWN
  279.  .IF wParam == VK_ESCAPE
  280.   INVOKE PostQuitMessage, NULL
  281.   RETURN 0
  282.  .ENDIF
  283. .ELSEIF uMsg == WM_DESTROY
  284.  INVOKE PostQuitMessage, NULL
  285.  RETURN 0
  286. .ENDIF
  287. INVOKE DefWindowProc, hWin, uMsg, wParam, lParam
  288. ret
  289. WndProc ENDP
  290. END start

Reply

Marsh Posté le 08-06-2001 à 09:59:28    

En tout cas ton source il a l'air marrant avec ses :D a repetition... vive la programmation fun

Reply

Marsh Posté le 08-06-2001 à 10:20:23    

la formule pour faire un feu:
- deux lignes en bas de l'écran avec des couleurs aléatoire dans ta palette de feu (donc du rouge vers le noir en passant par le jaune orangé...)
- la formule pour les pixels se trouvant au dessus de ses deux ligne:
  prenons pour un pixel de coordonnées x et y :
   pixel_color(x,y) = (pixel_color(x - 1,y + 1) +
                       pixel_color(x,y + 1)
                       pixel_color(x + 1,y + 1)
                       pixel_color(x,y + 2)) / 4
 
voila pour un joli petit feu
 
sinon, pour un fondu au noir, la formule est la suivante :
 
pixel_color(x,y) = (pixel_color(x - 1,y - 1) +
                    pixel_color(x + 1,y - 1)
                    pixel_color(x - 1,y + 1)
                    pixel_color(x + 1,y + 1)) / 4
 
 
Un petit conseil : pour éviter le clipping, utilise un système avec backbuffer
 
PS : je pars du principe que les coordonnées (0,0) sont en haut à gauche de ton écran.

Reply

Marsh Posté le 08-06-2001 à 12:00:59    

tgrx a écrit a écrit :

En tout cas ton source il a l'air marrant avec ses :D a repetition... vive la programmation fun




 
c'est clair c'est super marrant  :D  :D  :D  :D  :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed