Italia
Fonte/ Codesnippets

Bilder Bmp Direkt Opengl Programm Texturen

 
Eine kleine Demo zum Direkten einlesen von BMP-File per Texturen mit ASM-Befehlen/XPIA und dem Befehl "GetDIBits" per OpenGL.
Die Farbe "schwarz" wird durchsichtig gezeichnet.
Um das Programm zu benutzen, müssen noch 2 Muster-BMP-File erstellt werden.
Durch die gute Aiuto im Foro konnte ich das umsetzen.
Durch die 2D vorraussetzungen mit Opengl kann man sehr schön Sprites erzeugen und damit arbeiten.
Mit den Tasten "Q,W,E,S" kann man ein bisschen speilen.

Diese Demo kann jeder per sich neu umsetzen und auch in eigene Programme Teile davon übernehmen.
KompilierenMarkierenSeparieren
 $H Windows.ph
 {$iq}
declare bild1$
declare x1!,y1!,dx!,dy!,winkel!
declare hWin&

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

                mov al,255
                mov [ebx+ecx+3],al
                mov al,b
                mov [ebx+ecx+2],al
                mov al,r
                mov [ebx+ecx],al
                jmp weiter

            .endif

            mov al,g

            .if al>0

                mov al,255
                mov [ebx+ecx+3],al
                mov al,b
                mov [ebx+ecx+2],al
                mov al,r
                mov [ebx+ecx],al
                jmp weiter

            .endif

            mov al,r

            .if al>0

                mov al,255
                mov [ebx+ecx+3],al
                mov al,b
                mov [ebx+ecx+2],al
                mov al,r
                mov [ebx+ecx],al
                jmp weiter

            .endif

            mov al,0
            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

Window 20,20-600,450
Cls @RGB(220,220,220)
oGL("Init", %hWnd, 0,0, 0, 0)
oGL("PosMode", 1)
bild1$="muster.bmp"
var tex.auto%=erzeugetex(bild1$)
var tex.grund%=OGL("loadtexturebmp","muster1.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

    drawglscene()

ENDWHILE

proc drawglscene

    OGL("Clear")
    OGL("glEnable",~GL_BLEND)
    OGL("glBlendFunc",~GL_SRC_ALPHA, ~GL_ONE_MINUS_SRC_ALPHA)
    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!+90)
    OGL("quad",0.7,0.7)
    OGL("show")

endproc

proc erzeugetex

    parameters namebild$
    declare width%,height%
    declare Handle&,a&
    declare bmi#,bildxy#
    var texid%=0
    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

    Handle& = Create("hPic", -1, namebild$)
    a&=bmi#.biSizeImage&
    dim bildxy#,a&
    ~GetDIBits(%hdc,Handle&,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

 
19.08.2008  
 




Jörg
Sellmeyer
Bei mir wird das erste Bild um 90° gegen den Uhrzeigersinn gedreht. Wenns Absicht ist, kann ich das zumindest in dem Code nicht finden.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.08.2008  
 



Weil er die Achsen (nicht) vertauscht.
 
19.08.2008  
 



Das war in meinem Vorhaben absicht , weil es die Grafikform erforderte.

OGL("rotate",0,0,winkel!+90) setze : OGL("rotate",0,0,winkel! )

Kannst auch noch die SINUS und COSINUS verändern nach belieben.

mfg
 
19.08.2008  
 




Jörg
Sellmeyer
Ok, das hatte ich nicht gesehen.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.08.2008  
 



Der ASM-Code ist ein bisschen gekürzt mit : "jmp wandle".
Und so kann man sich dann am Code noch austoben mit besseren Routinen.

Wenn man die DLL nimmt, kann man auch dieses reinsetzen :

DEF rgb_umwandlung(2) ! "muster.dll","rgb_umwandlung"
und so aufrufen:
rgb_umwandlung(bildxy#,a&)
KompilierenMarkierenSeparieren
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

ss=s4 href='./../../function-references/xprofan/endif/'>EndIf
 
19.08.2008  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

7.107 Views

Untitledvor 0 min.
H.Brill29.10.2023
Tango30.10.2021
Sven Bader09.07.2021
Normann Strübli03.08.2020
Di più...

Themeninformationen

Dieses Thema hat 3 subscriber:

unbekannt (3x)
Jörg Sellmeyer (2x)
iF (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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