Deutsch
Quelltexte/ Codesnippets

Damit Ersten Glreadpixels Meine Versuche

 
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
"ogl("glReadBuffer",~GL_Front)"
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

 
20.08.2008  
 



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
 
20.08.2008  
 



Der Thread ist "hier" unter Programme aber falsch abgelegt, ein Admin bitte verschieben.
 
20.08.2008  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.646 Betrachtungen

Unbenanntvor 0 min.
funkheld27.04.2016
Julian Schmidt16.06.2012

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

unbekannt (2x)
iF (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie