21. marts 2001 - 08:40Der er
21 kommentarer og 2 løsninger
OpenGL & Bitmaps
Hejsa igen allesammen.
Forstil jer at jeg har en Tform der er dækket med en stor Tbitmap (ca.1024x768 pixels) mens en mindre Tbitmap (ca. 125x125 pixels)svæver rundt via en Ttimer. Den lille Tbitmap skal dog være halvt transparent så man svagt kan se den store Tbitmap gennem den lille. Til det bruger jeg:
for x := 0 to Tbitmap.width do for y := 0 to Tbitmap.height do //aflæser RGB farver på den store Tbitmaps r := getrvalue(Tbitmap.canvas.pixels[x,y]); g := getgvalue(Tbitmap.canvas.pixels[x,y]); b := getbvalue(Tbitmap.canvas.pixels[x,y]); r := r-150; g := g-150; b := b-150; //Farver den lille Tbitmap Tbitmap.canvas.pixels[x,y] := rgb(r,g,b);
I teorien skulle dette køre fint. Det gør det sådan set også... men det går bare alt for langsomt!!! Så jeg tænkte om man kunne gøre noget lign. med OpenGL - da jeg ved at den er hurtig til at håndtere grafik. Problemet er bare at jeg ikke kender så meget til fremvisning af \"flade\" Tbitmaps med OpenGL (da jeg kun kender til 3D siden af OpenGL).
PROBLEMSTILLING:
1. Hvordan viser man en Tbitmap på en Tform via OpenGL (ikke noget med 3D!!!).
2. Hvordan kan man gøre en Tbitmap halvt transparent så man kan se andre Tbitmaps under via OpenGL (ikke noget med 3D!!!) på en hurtigt måde så det ikke kræver så mange resourcer.
Når/hvis du behandler et bitmap så skal du ALDRIG gøre dette via pixel da dette altid vil tage \"7 år og en madpakke\", brug i stedet \"scanline\" da dette er væsentligt hurtigere.
Hvor kommer OpenGL ind i spørgsmålet? di skriver ikke noget om at det du i dag bruger har noget med OpenGL at gøre, og i såfald hvorledes? Hvis du alligevel ikke bruger OpenGL så vil jeg i dette tilfælde råde dig til at kigge i andre retninger da jeg har det opfattelse at OpenGL er bedre til 2D/3D frem for \"BMP behandling\". Jeg har selv for et par mdr. siden kigget på en del forsk. freeware/opensource grafik biblioteker som jeg tror ville være gavnlige i dette sammenhæng. Rent faktisk synes jeg at kunne huske at et af eksemplerne netop var en semi-transparent BMP. Desværre kan jeg ikke på stående fod huske hvad det var for et \"produkt\", og endvidere har jeg dem ikke lige ved hånden. MEN: jeg er rimeliglig sikker på at Graphi32 kan løse dit problem (jeg vil ikke afvist at \"det er den\"): http://www.geocities.com/den_alex/
zerohero> Jeg har selv lige prøvet at hente og installere Graphic32 og det var lige nøjagtig denne her at jeg tænkte på. Prøv eksemplet \"ImageView_Layers_Ex\". Start med at vælge: \"File-Load\" og load et stort (evt. 1024x768) baggrundsbillede. Dernæst vælger du \"Layers->New Bitmap Layer\", hvor du loader et mindre billede (eksempelvis dit 125x125). I skærmen højre side tager du fat i slideren til \"Opacity\" hvor du justere denne lidt ned...
Martin Lind>> Min mail adresse er: info@electronicbugs.org
Pellelil>> Hvodan kunne jeg bare vide at du ville reagere på denne spørgsmål!!! *GG*.
1. Du snakker noget om scanline. Hvordan kan jeg bruge scanline i den situation jeg er i???
2. Du spørger hvor OpenGL kommer ind i billedet. Det jeg mener er at jeg gerne vil have OpenGL til at behandle min 2D grafik. Men jeg ved ikke hvordan man eks. loader bitmaps og anvender dem med OpenGL.
zerohero> Jeg har rodet lidt med OpenGL, men aldrig sammen med Bitmaps (jeg har lavet 2D streg grafik med OpenGL). Når vi taler ren BMP graphic så ville jeg foretrække at bruge noget som \"Graphic32\".
Da du ikke selv ville kigge i Delphi\'s hjælp efter scanline, så har jeg gjort det for dig, og nedenstående har du eksemplet :-)
// This example shows drawing directly to the BitMap var x,y : Integer; BitMap : TBitMap; P : PByteArray; begin BitMap := TBitMap.create; try BitMap.LoadFromFile(\'..\\Images\\Splash\\256color\\factory.bmp\'); for y := 0 to BitMap.height -1 do begin P := BitMap.ScanLine[y]; for x := 0 to BitMap.width -1 do P[x] := y; end; Canvas.draw(0,0,BitMap);
finally BitMap.free; end; end; </SNIP>
Jeg kan ikke forklare hvorfor der er så stor forskel på Pixel og Scanline, men kan blot konstatere at det bliver værsentligt hurtigere når du bruger scanline. Dov vil jeg råde dig til at bruge Graphic32 i stedet for da dette sikkert i sidste ende vil være det hurtigste.
Martin Lind>> Det vil sige at det var Pelle\'s mail med Graphic32 jeg modtog. Så den demo du nævnte tidligere må du gerne prøve at sende til min hotmail adresse - hvis du gider :-)...
I skal begge have 1000 tak for jeres uundværlige hjælp... I er guder :-)... I har ærligt fortjent jeres points...
Pellelil>> hvis du har tid kunne du ikke lige lave et eksempel med scanlines som kan det samme som min canvas.pixels kode...
Her er der et alternativer til Graphic32 kaldet \"FastLib\": http://gfody.com/
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.