![]() |
Anzeige:
|
|
|||||||
| Spiele & OpenGL Spiele in XProfan und Fragen zur Spieleprogrammierung |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Ich habe ein Openglfenster 128x128 pixel.
Darin wird ein Objekt gedreht dargestellt. Davon mache ich ein Bild für Drawpix und bearbeite dieses usw.,nach Drawpic lösche ich das Handle wieder und springe dann wieder zur Procedure oglzubmp um ein neues gedrehtes Bild zu holen. Dieses klappt eigentlich wunderbar. Bloss irgendwann kommt die Meldung : Kann Ogl-Bild nicht laden. Ich vermute das irgendwo der Speicher voll ist. Auch mit delete geschieht keine Freigabe, vermute ich. Wo liegt der Hase im Pfeffer begraben? Code:
...........
..........
proc oglzubmp
handle&=create("hPic",0,"&OGLBMP" )
endproc
...........
..........
Drawpic handle&,0,0;-1
delete handle&
.........
......
|
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Der Befehl zum Löschen ist nicht Delete sondern DeleteObject.
Ansonsten mal mehr vom Source posten, da kann man mehr mit reinschauen.
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#3 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Für diese Abfrage möchte ich den Profancode mal einsetzen, ob er funktioniert.
Eigentlich spricht die Frage für sich ohne auf dem Code unten einzugehen. proc oglzubmp ogl("glReadPixels",0,0,128,128,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#) ~setDIBits(%hdc,bild_auto_h&,0,128,ogl_rgb#,bmi#,0) endproc Mit Profancode eingebaut zum Testen : handle&=create("hPic",0,"&OGLBMP" ) deleteobject handle& hier wird irgendwie der Speicher vollgemüllt. Das die Fehlermeldung kommt. Die Routine wird ja bei jedem Lenken aufgerufen und das Ogl-Fenster zwischengespeichert als Pic: proc oglzubmp handle&=create("hPic",0,"&OGLBMP" ) deleteobject handle& ogl("glReadPixels",0,0,128,128,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#) ~setDIBits(%hdc,bild_auto_h&,0,128,ogl_rgb#,bmi#,0) endproc Hier das Programm: Code:
$H Windows.ph
declare x1!,y1!,dx!,dy!,winkel!,y&,z%,texid%,ende%
declare hWin&,hwin1&,hwin2&,hwin3&
declare width%,height%,groesse%
declare bild_auto_h&,bild_umw_h&,bild_hin_h&
declare bmi#,bildxy# ,ogl_rgb#,bild_hin#
groesse%=128*128*4+1023
dim bildxy#,groesse%
dim ogl_rgb#,groesse%
dim bild_hin#,groesse%
If 0
AsmStart bmptex
Parameters bildxy#,groesse%
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL w :DWORD
mov eax,para2
mov w,eax
mov ecx,0
mov ebx,para1
.while ecx<=w
mov al,[ebx+ecx]
mov b,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov r,al
and b,255
and g,255
and r,255
mov al,b
.if al>0
jmp wandle
.endif
mov al,g
.if al>0
jmp wandle
.endif
mov al,r
.if al>0
jmp wandle
.endif
mov al,0
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
wandle:
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
weiter:
add ecx,4
.endw
AsmEnd
AsmStart rgb_farbe
Parameters bild_hin#,groesse%
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL n :DWORD
mov eax,para2
mov n,eax
mov ecx,0
mov ebx,para1
.while ecx<=n
mov al,[ebx+ecx]
mov r,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov b,al
mov al,b
.if al>252
mov eax,255
.break
.endif
mov al,g
.if al>252
mov eax,255
.break
.endif
mov al,r
.if al>252
mov eax,255
.break
.endif
add ecx,4
.endw
AsmEnd(z%)
endif
ende%=1
Window 20,20-800,600
Cls @RGB(220,220,220)
hWin& = @Create("text", %hWnd, "Test1", 10, 10, 128,128)
hWin1& = @Create("text", %hWnd, "Test2", 250, 20, 500,500)
hWin2& = @Create("text", %hWnd, "Test3", 10, 150, 128,128)
var hDCWin& = ~GetDC(hWin&)
var hDCWin1& = ~GetDC(hWin1&)
var hDCWin2& = ~GetDC(hWin2&)
ShowWindow(hWin&,1)
oGL("Init", hwin&, 0,0, 0, 0)
oGL("PosMode", 1)
ogl("glReadBuffer",~GL_Back)
bild_auto_h& = Create("hnewPic",128,128,0 )
var bild_2& = Create("hnewPic",500,500,0 )
var tex.auto%=erzeugetex("auto.bmp")
var bild_back_h& = Create("hPic", -1,"back.bmp")
startpaint bild_back_h&
drawpic "hin.bmp",200,200,0
endpaint
var iDC&=~CreateCompatibleDC(hDCWin1&)
var iBitmap& = ~CreateDIBSection(idc&, bmi#, ~DIB_RGB_COLORS, 0,0,0)
~SelectObject(iDC&, iBitmap&)
setTimer 20
drawglscene
drawglscene
oglzubmp
WHILE ende%
WaitInput
if isKey(87)
y1!=Sin((-winkel!)/180.0*pi())*2
x1!=Cos((-winkel!)/180.0*pi())*2
dx!=dx!-x1!
dy!=dy!-y1!
drawglscene
oglzubmp()
endif
if isKey(83)
y1!=Sin((-winkel!)/180.0*pi())*2
x1!=Cos((-winkel!)/180.0*pi())*2
dx!=dx!+x1!
dy!=dy!+y1!
drawglscene
oglzubmp()
endif
if isKey(81)
winkel!=winkel!+1.0
drawglscene
oglzubmp()
endif
if isKey(69)
winkel!=winkel!-1.0
drawglscene
oglzubmp()
endif
startpaint bild_2&
drawpic bild_back_h&,0,0,0
drawpic bild_auto_h&,100+dx!,100+dy!,-1
endpaint
startpaint hwin1&
drawpic bild_2&,0,0,0
endpaint
startpaint hwin2&
copypic bild_2&,200,200 - 128,128 > 0,0,0
endpaint
~Bitblt(idc&,0,0,128,128,hDCWin1&,200,200,~SRCCOPY)
~GetDIBits(hDCWin1&,iBitmap&,0,128,bild_hin#,bmi#,~DIB_RGB_COLORS)
z%=Call(xpia_getprocaddressm(xpia_hmodule&,"rgb_farbe"),bild_hin#,groesse%)
StartPaint %hwnd
DrawText 10,300,(Format$("######0' '",z%))
EndPaint
ENDWHILE
killTimer
end
proc oglzubmp
ogl("glReadPixels",0,0,128,128,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#)
~setDIBits(%hdc,bild_auto_h&,0,128,ogl_rgb#,bmi#,0)
endproc
proc drawglscene
OGL("Clear")
OGL("origin",0,0,-1.11)
OGL("texture",tex.auto%,1)
OGL("rotate",0,0,winkel!)
OGL("quad",0.5,0.5)
OGL("show")
endproc
proc bitmap_header
def &BI_RGB 0
def &DIB_RGB_COLORS 0
struct BITMAPINFOHEADER = \
biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&, \
biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
dim bmi#,BITMAPINFOHEADER
clear bmi#
with bmi#
.biSize& = sizeof(bmi#)
.biWidth& = width%
.biHeight& = height%
.biPlanes% = 1
.biBitCount% = 32
.biCompression& = &BI_RGB
.biSizeImage& = ((.biWidth& * .biBitCount% \ 8 - 1) | 3 + 1) * abs(.biHeight&)
endwith
endproc
proc erzeugetex
parameters namebild$
texid%=0
height%=128
width%=128
dispose bmi#
bitmap_header()
bild_umw_h& = Create("hPic", -1, namebild$)
~GetDIBits(%hdc,bild_umw_h&,0,bmi#.biHeight&,bildxy#,bmi#,0)
Call(xpia_getprocaddressm(xpia_hmodule&,"bmptex"),bildxy#,groesse%)
OGL("glGenTextures",1,ADDR(texid%))
OGL("glBindTexture",~GL_TEXTURE_2D,texid%)
OGL("glEnable",~GL_ALPHA_TEST)
OGL("glAlphaFunc",~GL_GREATER, 0.1)
OGL("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
OGL("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
OGL("gluBuild2DMipmaps",~GL_TEXTURE_2D, ~GL_RGBA, height%, width%, ~GL_RGBA, ~GL_UNSIGNED_BYTE, bildxy#)
dispose bildxy#
RETURN texid%
endproc
Geändert von profanfan (25.02.2009 um 18:21 Uhr) |
|
|
|
|
|
#4 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
|
Hallo,
kannst Du mal ein Programm ohne XPSE/XPIA posten, dass Dein Problem demonstriert, damit ich es analysieren kann? Gruß Roland
__________________
Pentium D 2,8 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon HD5450 1024 MB / Windows 7(32) - XProfan X2.0c AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 / Windows 7(64) - XProfan X2.0c http://www.xprofan.de |
|
|
|
|
|
#5 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Einfach auf dem Button "vorwärts" oder "rückwärts", nach einer weile kommt die Fehlermeldung:
Bitmap nicht ladbar. Na, jetzt hoffe ich auf eine Lösung... Code:
declare ende%
declare rtri!, rquad!, wert!
Declare hWin&, hDlg1&, hDlg&,handle&
declare B1%,B2%,B3%,B0%
proc DrawGLScene
oGL("Clear")
oGL("Origin", -1.5, 0, -6)
oGL("Color", 0, 0, 1, 1)
oGL("Rotate", 0, rtri!, 0)
oGL("Triangle", 2, 2)
oGL("Origin", 1.5, 0, -6)
oGL("Color", 1, 0, 0, 1)
oGL("Rotate", rquad!, 0, 0)
oGL("Quad", 2, 2)
oGL("Show")
rtri! = rtri! + wert!
rquad! = rquad! + wert!
if rtri! > 360
rtri!=0
endif
if rtri! < 0
rtri!=360
endif
if rquad! > 360
rquad! =0
endif
if rquad! < 0
rquad! = 360
endif
endproc
hWin& = @Create("Window", %hWnd, "Test1", 0, 0, 320, 200)
hDlg& = @Create("Dialog", hWin&, "Test2", 320, 200, 320, 200)
hDlg1& = @Create("Dialog", hWin&, "Test3", 0, 200, 320, 200)
B1% = @Create("Button",hDlg&,"vorwärts",020,020,100,030)
B2% = @Create("Button",hDlg&,"rückwärts",20,060,100,030)
B3% = @Create("Button",hDlg&,"ende",20,100,100,030)
B0% = Create("Button",hDlg&,"",0,0,0,0)
oGL("Init", hwin&, 0, 0, 0, 0)
oGL("PosMode", 1)
Ende% = 0
wert!=0
WhileNot ende%
sleep 1
If Getfocus(B1%)
wert!=wert!+0.1
setfocus(B0%)
elseIf Getfocus(B2%)
wert!=wert!-0.1
setfocus(B0%)
ElseIf @Clicked(B3%)
ende%=1
EndIf
DrawGLScene
StartPaint hDlg1&
DrawText 20,20,("rtri! = " + Format$("#####0' '",rtri!))
DrawText 20,50,("rquad! = " + Format$("#####0' '",rquad!))
DrawText 20,80,("wert! = " + Format$("###,##0.00' '",wert!))
handle&=create("hPic",0,"&OGLBMP" )
EndPaint
EndWhile
End
Geändert von profanfan (26.02.2009 um 13:24 Uhr) |
|
|
|
|
|
|
#6 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
|
Hallo,
es liegt, wie weiter oben schon erwähnt wurde, daran, dass Du das Bitmap-Handle nicht wieder freigibst und irgendwann kein neues Handle erzeugt werden kann. (Bei Sleep 1 verbrauchst Du pro Sekunde ca. 1000 Handles! Die Bitmap ist 320 * 200 Pixel groß, das macht bei 32 Bit Farbtiefe 256 MB pro Sekunde. Das würde selbst auf Jacs Rechner nicht lange gut gehen.) Zerstöre einfach die Bitmap vor Erzeugung der neuen Bitmap und es läuft ohne Probleme: Code:
...
StartPaint hDlg1&
DrawText 20,20,("rtri! = " + Format$("#####0' '",rtri!))
DrawText 20,50,("rquad! = " + Format$("#####0' '",rquad!))
DrawText 20,80,("wert! = " + Format$("###,##0.00' '",wert!))
deleteobject handle&
handle&=create("hPic",0,"&OGLBMP" )
EndPaint
...
Roland
__________________
Pentium D 2,8 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon HD5450 1024 MB / Windows 7(32) - XProfan X2.0c AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 / Windows 7(64) - XProfan X2.0c http://www.xprofan.de |
|
|
|
|
|
#7 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Besser noch:
Case handle&: DeleteObject handle& Sonst beschweren sich die 98/ME-ler wieder...
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#8 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Funktioniert wunderbar.
Dann brauche ich mich nicht mit dem GDI voll beschäftigen, weil man da auch Flächen drehen kann. Wie kann ich das jetzt Flimmerfrei im Fenster "Test4" hinbekommen? mfg Code:
declare ende%
declare rtri!, rquad!, wert!
Declare hWin&, hDlg1&, hDlg&,handle&,hDlg2&,hintergr&
declare B1%,B2%,B3%,B0%
proc DrawGLScene
oGL("Clear")
oGL("Origin", -1.5, 0, -6)
oGL("Color", 0, 0, 1, 1)
oGL("Rotate", 0, rtri!, 0)
oGL("Triangle", 2, 2)
oGL("Origin", 1.5, 0, -6)
oGL("Color", 1, 0, 0, 1)
oGL("Rotate", rquad!, 0, 0)
oGL("Quad", 2, 2)
oGL("Show")
rtri! = rtri! + wert!
rquad! = rquad! + wert!
if rtri! > 360
rtri!=0
endif
if rtri! < 0
rtri!=360
endif
if rquad! > 360
rquad! =0
endif
if rquad! < 0
rquad! = 360
endif
Case handle&: DeleteObject handle&
handle&=create("hPic",0,"&OGLBMP" )
StartPaint hDlg2&
drawpic hintergr&,0,0;0
drawpic handle&,0,0;-1
EndPaint
endproc
hWin& = @Create("Window", %hWnd, "Test1", 0, 0, 320, 200)
hDlg& = @Create("Dialog", hWin&, "Test2", 320, 200, 320, 200)
hDlg1& = @Create("Dialog", hWin&, "Test3", 0, 200, 320, 200)
hDlg2& = @Create("Dialog", hWin&, "Test4", 0, 400, 320, 200)
B1% = @Create("Button",hDlg&,"vorwärts",020,020,100,030)
B2% = @Create("Button",hDlg&,"rückwärts",20,060,100,030)
B3% = @Create("Button",hDlg&,"ende",20,100,100,030)
B0% = Create("Button",hDlg&,"",0,0,0,0)
oGL("Init", hwin&, 0, 0, 0, 0)
oGL("PosMode", 1)
Ende% = 0
wert!=0
handle&=create("hPic",0,"&OGLBMP" )
hintergr&=create("hnewpic",320,200,$00ffff)
WhileNot ende%
If Getfocus(B1%)
wert!=wert!+0.1
setfocus(B0%)
elseIf Getfocus(B2%)
wert!=wert!-0.1
setfocus(B0%)
ElseIf @Clicked(B3%)
ende%=1
EndIf
DrawGLScene
StartPaint hDlg1&
DrawText 20,20,("rtri! = " + Format$("#####0' '",rtri!))
DrawText 20,50,("rquad! = " + Format$("#####0' '",rquad!))
DrawText 20,80,("wert! = " + Format$("###,##0.00' '",wert!))
EndPaint
EndWhile
End
Geändert von profanfan (26.02.2009 um 18:32 Uhr) |
|
|
|
|
|
#9 (Direktlink) |
|
Gast
Beiträge: n/a
|
'so ???
StartPaint hDlg2& drawpic hintergr&,0,0;-1 drawpic handle&,0,0;-1 EndPaint |
|
|
|
#10 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
so: drawpic hintergr&,0,0;-1
neeeeeeeeeeeee..... so: drawpic hintergr&,0,0;0 Der Hintergrund soll nicht durchsichtig werden... |
|
|
|
|
|
|
#11 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Gibt es in Profan irgendwie ein Vsync-Befehl für einem ruhigen Grafikaufbau...?
mfg |
|
|
|
|
|
#12 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Steht einer in der XProfan-Hilfe?
Hier steht, wie es gemacht wird: C++ - Deaktivieren von VSync unter OpenGL
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. Geändert von Frabbing (26.02.2009 um 23:30 Uhr) |
|
|
|
|
|
#13 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Nein, meine den für das normale Profanwindows.
mfg |
|
|
|
|
|
#14 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Du kannst den Code nach XProfan umsetzen.
Ich glaube, David Strutz hat das schonmal gemacht und eine Inc daraus gemacht. Such mal in der Community nach oglhelper.inc. Die wird dir sicher weiter helfen. Ansonsten wäre das auch eine Anregung für Roland es einzubauen.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#15 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 21.02.2009
Beiträge: 71
|
Jup, danke.
mfg |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Add ons laden nicht | ABCDEF | Windows XP | 2 | 12.08.2008 19:58 |
| S-ATA Treiber aus DOS laden | Anaconda | Software - Allgemein | 1 | 11.07.2005 13:01 |
| Flashvideo laden in VB6 | gast1 | Visual Basic, Visual Basic.NET | 1 | 02.05.2005 09:41 |
| pc laden | weinachtsmann | Allgemein | 4 | 23.04.2003 17:44 |
| WIN ME neu laden | Rolf | Windows 95/98/ME/2000/NT | 2 | 22.12.2002 11:51 |