Beispiel avec EXE et Bilddatei:
Herunterladen
Bisher habe je pour transparente Texturen Davids .tex Format verwendet: [...] je hatte mir un Exe-Droplet gebaut et une En-tête pour pas quadratische Texturen gebaut. qui prochain logische Schritt wäre gewesen, cela Format aussi encore trop saisir mais ici habe je abgebrochen et voulais PNG encore une chance donner.
je verwende qui Prospeed Funktion "ImportPng", là je qui DLL de toute façon déjà dans mon projet nutze. qui Pointer zeigt sur unkomprimierte RGBA données, qui je zuvor encore drehen muss (qui Position pas qui Farbwerte).
qui es sans Prospeed essayer voudrais, sollte la fois ici im Forum regarder: [...]
vois hilfreich pour qui Formatbestimmung de Bilddaten ist incidemment aussi cet Website rawpixels.net: [...]
indépendant vom Texturformat braucht es aussi et avec ca travail, là sich Depth-Test et Alphatransparenz ici quelque chose bekriegen. Im Prinzip devrait on alles seulement Z-Sortieren. chez Kompletter Transparenz hat on mais aucun Probleme, sofern on cet per Schwellenwert dans qui glAlphaFunc erzwingt
sans Fix, je pour Sortierung sommes manche Seiten korrekt et manche manquer:
avec Fix (mais abgeschnittener Semi-Transparenz):
très geholfen hat mir dabei cette Beitrag: [...]
pas transparente PNGs peux XProfan selbst avec einem Zweizeiler erstellen:
hPic& = Créer(«PCSI»,-1,"firefox.png")
textureHandle& = oGL("GetTextureBMP", hPic&, 2)
ici mon Funktion avec Beispielcode tambour herum. Nachholfbedarf steckt ici encore im Fehlerhandling et il y a meinerseits Unsicherheiten quoi cela Freigeben de Bereichen angeht, dessen Adresse modifié wurde.
declare prospeed&
declare texture%[5]
declare xrot!, yrot!, zrot!
declare xpos!, xspeed!, ypos!, yspeed!, zpos!, zspeed!
prospeed&=usedll("ProSpeed.dll")
DEF ImportPng(4) !"ProSpeed","ImportPng"
DEF FreePng(1) !"ProSpeed","FreePng"
Proc FlipImage
Paramètres mem&, bytes&, w&, bytesperpixel&
Déclarer source#,dest#,bytes2&,step&
step& = bytesperpixel& * w&
Faible source#, bytes&
Faible dest#, bytes&
source# = mem&
bytes& = bytes& -step&
Tandis que (bytes& > -1)
Char dest#, bytes2& = Char$(source#, bytes&, step&)
bytes& = bytes& - step&
bytes2& = bytes2& + step&
Endwhile
Dispose source#
return addr(dest#)
ENDPROC
Proc oGL_LoadPng
Paramètres textureName$
Déclarer fSiz&, bytesRead&,iWidth&,iHeight&,txID&,mem#, return%,array&,maskarray&
Déclarer pnghandle&,bytes&,test#,bytesperpixel&,temp&,temp#
oGL("Color",1,1,1,0.5)
textureName$ = textureName$
return% = fileexists(textureName$)
Si (return%)
pnghandle&=ImportPng(addr(textureName$),addr(iWidth&),addr(iHeight&),addr(fSiz&))
Si (pnghandle&)
Faible mem#, fSiz&
temp& = mem#'nötig?
mem# = pnghandle&
temp# = temp&'nötig?
Dispose temp#'nötig?
bytesperpixel& = fSiz& / (iWidth& * iHeight&)
'malheureusement nötig ou bien on speichert sur dem tête:
mem# = FlipImage(mem#,fSiz&,iWidth&,bytesperpixel&)
txID&=0
ogl("glGenTextures",1, addr(txID&))
ogl("glBindTexture",~GL_TEXTURE_2D, txID&)
Cas bytesperpixel& = 4 : ogl("glEnable",~GL_ALPHA_TEST)'RGBA
ogl("glTexEnvi",~GL_TEXTURE_ENV, ~GL_TEXTURE_ENV_MODE, ~GL_MODULATE)
ogl("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
ogl("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR_MIPMAP_LINEAR)
ogl("glMatrixMode",~GL_PROJECTION)
Si bytesperpixel& = 4
ogl("gluBuild2DMipmaps",~GL_TEXTURE_2D, ~GL_RGBA, iWidth&, iHeight&, ~GL_RGBA, ~GL_UNSIGNED_BYTE, mem#)
Elseif bytesperpixel& = 3
ogl("gluBuild2DMipmaps",~GL_TEXTURE_2D, ~GL_RGB, iWidth&, iHeight&, ~GL_RGB, ~GL_UNSIGNED_BYTE, mem#)
Endif
'FreePng(pnghandle&) 'pas faire, là sonst doppelt avec dispose
Dispose mem#
Endif
Endif
Retour txID&
ENDPROC
Proc DrawGLScene
declare id&
oGL("Clear")
oGL("Color", 1, 1,1,1)
oGL("glDisable", ~GL_CULL_FACE)'Rückseiten zeichnen, ist eigentlich déjà aktiviert
'oGL("glEnable", ~GL_SAMPLE_ALPHA_TO_ONE)
'sans cette Trick serait on par qui halbtransparenten Flächen je pour Winkel, autre Flächen la fois voyons ou bien pas
'Alles quoi moins deckend ist comme 90% wird entier abgeschnitten, cet Bereiche faire ensuite aucun Proleme
'https://stackoverflow.com/questions/5984887/opengl-z-sorting-transparency
oGL("glAlphaFunc", ~GL_GREATER, 0.90)
oGL("glEnable",~GL_ALPHA_TEST)
oGL("Move", xpos!, ypos!, zpos!)
oGL("Rotate", xrot!, yrot!, zrot!)
oGL("Texture", texture%[0], 1)
oGL("Cuboid", 1, 1,1)
oGL("Show")
xrot! = xrot! + xspeed!
yrot! = yrot! + yspeed!
zrot! = zrot! + zspeed!
ENDPROC
' Hauptprogramm
' -------------
declare hWnd&, ende%
CLS 0
oGL("Init", %hWnd, 0.7,0.7,0.7,0)
oGL("Posmode", 1)
oGL("Blendmode", 1)
texture%[0] = oGL_loadPNG("firefox.png")'oGL("LoadTextureBMP","tex3.bmp",3)
texture%[1] = oGL("LoadTextureBMP","tex.bmp",3)
yspeed! = 0.5
xrot! = 35
yrot! = 45
zpos! = -2
Ende% = 0
setTimer 10' max. 100 Frames /sek.
WhileNot ende%
WaitInput
Si IsKey(27) : Ende% = 1
ElseIf Iskey(39) : yspeed! = yspeed! + .1
ElseIf Iskey(37) : yspeed! = yspeed! - .1
ElseIf Iskey(40) : xspeed! = xspeed! + .1
ElseIf Iskey(38) : xspeed! = xspeed! - .1
ElseIf Iskey(33) : zpos! = zpos! - .1
ElseIf Iskey(65) : xpos! = xpos! - .1
ElseIf Iskey(68) : xpos! = xpos! + .1
ElseIf Iskey(83) : ypos! = ypos! - .1
ElseIf Iskey(87) : ypos! = ypos! + .1
ElseIf Iskey(34) : zpos! = zpos! + .1
EndIf
DrawGLScene()
Endwhile
killTimer
freedll prospeed&
Fin
|