Quelltexte/ Codesnippets | | | | | Erste Anfängerversuche mit "glReadPixels" von mir.
Mit diesem Befehl KompilierenMarkierenSeparieren"ogl("glReadPixels",x,y,xw,yh+,~GL_RGBA,~GL_UNSIGNED_BYTE,bereich#) "
kann man im Zusammenhang mit KompilierenMarkierenSeparieren das Openglfenster als Grafikbild in eine Bereichsvariable reinpacken und auswerten für evtl Collisionen, erstmal bei mir in 2D, oder anzeigen, wie in der Demo. Die Auswahl ist der Fontbuffer oder der Backbuffer.
x und y ist der Punkt im OpenGL-Fenster von wo aus die Breite xw und die Höhe yh in die Bereichsvariable eingelesen wird. Ein Punkt entspricht 4 Byte (RGBA), entsprechend muss die Bereichsvariable angelegt werden. Da ich ein Bild von 128x128 Pixel habe , ist die Bereichsvariable bei mir 128*128*4.
Ich habe bei mir ein OpenGlFenster von 350x350 Pixel. Mein Bild lese ich bei x=140 und y=140 aus , mit einer Breite von 128 und einer Höhe von 128 , um es einfach zu halten um für meinen Versuch keine neue KompilierenMarkierenSeparieren"bild_h& = Create("hPic", -1, namebild$)"
anzulegen. Gewählt habe ich den Backbuffer.
Mit diesem Befehl : ~setDIBits(%hdc,bild_h&,0,bmi#.biHeight&,bereich#,bmi#,0) lese ich das Bild in das Handle bild_h& ein, man kann auch hier wieder ein anderes Handle mit "bild_h& = Create("hPic", -1, namebild$)" anlegen. Das weiss ich noch nicht, wie man ein Handle festlegt mit Create ohne eine BMP(Bild) reinzusetzen. Und mache dieses Bild von "glReadPixels" auf dem Hauptfenster links(nicht OpenGlFenster) sichtbar mit "drawpic bild_h&,10,10,0".
Vorher müssen auch wieder 2 BMP-Bilder angelegt werden, einmal den Hintergrund und einmal ein Objekt zum Steuern. XPIA muss auch wieder aktiviert werden.
Bitte diese Demo mit neuen Ideen bestücken, vielleicht habt ihr noch wesentlich bessere Einfälle um dieses auszubauen. Diese Demo ist nur ein I-Tüpflelchen, ist mal eine Idee, die am Anfang steht.
Die Farben sind noch vertauscht vom Bild "glReadPixels", weil diese andersherum eingelesen werden. KompilierenMarkierenSeparieren $H Windows.ph
If 0
AsmStart rgb_umwandlung
Parameters bildxy#,a&
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
EndIf
declare bild1$
declare x1!,y1!,dx!,dy!,winkel!
declare hWin&
declare width%,height%
declare bild_h&,a&
declare bmi#,bildxy# ,ogl_rgb#
var groesse%=128*128*4
dim ogl_rgb#,groesse%
var texid%=0
Window 20,20-600,450
Cls @RGB(220,220,220)
hWin& = @Create("text", %hWnd, "Test1", 220, 10, 350, 350)
oGL("Init", hwin&, 0,0, 0, 0)
oGL("PosMode", 1)
bild1$="auto.bmp"
var tex.auto%=erzeugetex(bild1$)
var tex.grund%=OGL("loadtexturebmp","tile1.bmp",3)
var ende%=1
WHILE ende%
sleep 1
if isKey(65)
ende% = 0
endif
if isKey(81)
winkel!=winkel!+0.4
endif
if isKey(69)
winkel!=winkel!-0.4
endif
if isKey(87)
y1!=Sin(winkel!/180.0*pi())*0.02
x1!=Cos(winkel!/180.0*pi())*0.02
dx!=dx!-x1!
dy!=dy!-y1!
endif
if isKey(83)
y1!=Sin(winkel!/180.0*pi())*0.02
x1!=Cos(winkel!/180.0*pi())*0.02
dx!=dx!+x1!
dy!=dy!+y1!
endif
ogl("glReadBuffer",~GL_Back)
ogl("glReadPixels",140,140,128,128,~GL_RGBA,~GL_UNSIGNED_BYTE,ogl_rgb#)
~setDIBits(%hdc,bild_h&,0,bmi#.biHeight&,ogl_rgb#,bmi#,0)
drawpic bild_h&,10,10,0
drawglscene()
ENDWHILE
proc drawglscene
OGL("Clear")
OGL("move",0,0,-3)
OGL("texture",tex.grund%,10)
OGL("move",0,0,0)
OGL("quad",8,8)
OGL("origin",dx!,dy!,-3)
OGL("texture",tex.auto%,1)
OGL("rotate",0,0,winkel!)
OGL("quad",0.7,0.7)
OGL("show")
endproc
proc erzeugetex
parameters namebild$
mcls 0,0,0
startpaint -1
mloadbmp namebild$,0,0
endpaint
height%=%bmpx
width%=%bmpy
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
bild_h& = Create("hPic", -1, namebild$)
a&=bmi#.biSizeImage&
dim bildxy#,a&
~GetDIBits(%hdc,bild_h&,0,bmi#.biHeight&,bildxy#,bmi#,0)
Call(xpia_getprocaddressm(xpia_hmodule&,"rgb_umwandlung"),bildxy#,a&)
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 bmi#
dispose bildxy#
RETURN texid%
endproc
|
| | | | |
| | | Habe eine Lösung für das leere Handle gefunden :
declare bild_h1&
mcls 128,128,0 bild_h1& = Create("hPic", 0,"&MEMBMP" )
Jetzt müssen diese beiden Befehle damit bestückt werden :
~setDIBits(%hdc,bild_h1&,0,128,ogl_rgb#,bmi#,0)
drawpic bild_h1&,10,10,0
Weiterhin den richtigen Parameter gefunden, damit die Farben nicht vertauscht werden :
~GL_BGRA statt ~GL_RGBA , also:
ogl("glReadPixels",140,140,128,128,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#)
mfg |
| | | | |
| | | Der Thread ist "hier" unter Programme aber falsch abgelegt, ein Admin bitte verschieben. |
| | | | |
|
Zum QuelltextThemenoptionen | 4.650 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |