Ejemplo con EXE y Bilddatei:
Descargar
Bisher Yo para transparente Texturen Davids .tex Formato verwendet: [...] Tuve me una Exe-Droplet gebaut y una Encabezamiento para no quadratische Texturen gebaut. Der nächste logische Schritt wäre gewesen, el Formato auch todavía a packen aber hier Yo abgebrochen y quería PNG ni Chance geben.
Yo verwende el Prospeed Función "ImportPng", como Yo el DLL ohnehin ya en mi Projekt nutze. Der Pointer zeigt en unkomprimierte RGBA Daten, el Yo zuvor todavía drehen muss (el Position no el Farbwerte).
Wer lo sin Prospeed probieren möchte, debería veces hier en el Foro schauen: [...]
Sehe hilfreich para el Formatbestimmung de Bilddaten es de paso estos Website rawpixels.net: [...]
Unabhängig vom Texturformat braucht lo auch todavía algo Arbeit, como se Depth-Test y Alphatransparenz hier algo bekriegen. Im Principio debería uno alles sólo Z-Sortieren. En Kompletter Transparenz ha uno pero no Problemas, sofern uno esta por Schwellenwert en el glAlphaFunc erzwingt
Ohne Fix, je después de Sortierung son manche Páginas korrekt y manche fehlen:
Mit Fix (aber abgeschnittener Semi-Transparenz):
Sehr geholfen ha me esta dieser Contribución: [...]
No transparente PNGs kann XProfan incluso con un Zweizeiler redactar:
hPic& = Crear("HPIC",-1,"firefox.png")
textureHandle& = oGL("GetTextureBMP", hPic&, 2)
Hier mi Función con Beispielcode tambor herum. Nachholfbedarf steckt hier aún en Fehlerhandling y lo son meinerseits Unsicherheiten qué el Freigeben de Bereichen angeht, dessen Adresse cambiado wurde.
declarar prospeed&
declarar texture%[5]
declarar xrot!, yrot!, zrot!
declarar xpos!, xspeed!, ypos!, yspeed!, zpos!, zspeed!
prospeed&=usedll("ProSpeed.dll")
DEF ImportPng(4) !"ProSpeed","ImportPng"
DEF FreePng(1) !"ProSpeed","FreePng"
Proc FlipImage
Parámetros mem&, bytes&, w&, bytesperpixel&
Declarar source#,dest#,bytes2&,step&
step& = bytesperpixel& * w&
Dim source#, bytes&
Dim dest#, bytes&
source# = mem&
bytes& = bytes& -step&
Mientras que (bytes& > -1)
Char dest#, bytes2& = Char$(source#, bytes&, step&)
bytes& = bytes& - step&
bytes2& = bytes2& + step&
EndWhile
Disponer source#
volver addr(dest#)
ENDPROC
Proc oGL_LoadPng
Parámetros textureName$
Declarar fSiz&, bytesRead&,iWidth&,iHeight&,txID&,mem#, volver%,array&,maskarray&
Declarar pnghandle&,bytes&,test#,bytesperpixel&,temp&,temp#
oGL("Color",1,1,1,0.5)
textureName$ = textureName$
volver% = fileexists(textureName$)
If (volver%)
pnghandle&=ImportPng(addr(textureName$),addr(iWidth&),addr(iHeight&),addr(fSiz&))
If (pnghandle&)
Dim mem#, fSiz&
temp& = mem#'nötig?
mem# = pnghandle&
temp# = temp&'nötig?
Disponer temp#'nötig?
bytesperpixel& = fSiz& / (iWidth& * iHeight&)
'desafortunadamente nötig oder uno speichert en el Kopf:
mem# = FlipImage(mem#,fSiz&,iWidth&,bytesperpixel&)
txID&=0
ogl("glGenTextures",1, addr(txID&))
ogl("glBindTexture",~GL_TEXTURE_2D, txID&)
Case 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)
If 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&) 'no hacer, como sonst doppelt con disponer
Disponer mem#
Endif
Endif
Volver txID&
ENDPROC
Proc DrawGLScene
declarar id&
oGL("Clear")
oGL("Color", 1, 1,1,1)
oGL("glDisable", ~GL_CULL_FACE)'Rückseiten dibujar, es eigentlich ya aktiviert
'oGL("glEnable", ~GL_SAMPLE_ALPHA_TO_ONE)
'Ohne esta Trick sería uno por el halbtransparenten Flächen je después de Winkel, otro Flächen veces sehen oder no
'Alles qué weniger deckend es como 90% se bastante abgeschnitten, esta Bereiche hacer entonces no 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
' -------------
declarar 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.
Sinestar encargado ende%
WaitInput
If 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&
End
|