Zxiii Skrevet 12. mai 2008 Del Skrevet 12. mai 2008 Hei! I forbindelse med en skoleoppgave har jeg laget en roterende kube som skal mappes med en texture. Hver gang programmet kjøres skal texturen genereres på ny og overskrive den gamle. Kuben får dermed nytt mønster under hver kjøring, siden texturen er endret. Dette fungerer utmerket under debugging, men ikke under release-build. Ved kjøring i release-build endres ikke mønsteret på kuben. Jeg har sjekket at den gamle texture-filen blir overskrevet med den nye under hver kjøring, og at den ligger på riktig plass. Det ser med andre ord ut til at det kun er den gamle texturen som hver gang lastes inn på kuben, og at programmet gir blaffen i at texturen faktisk er endret. Dette skjer som sagt kun i releasebuild, mens programmet fungerer som det skal under debugging. Noen ideer om hvordan jeg kan få ordnet dette? PS. Jeg har skrevet programmet i Visual Studio 2005, ved bruk av C# og XNA. For å lage texture har jeg brukt System.Drawing biblioteket. Lenke til kommentar
caid Skrevet 12. mai 2008 Del Skrevet 12. mai 2008 Du bør kansje laste opp kildekoden eller deler av den, om noen skal kunne hjelpe deg. Vanskelig å bare gjette seg til en slik feil. Lenke til kommentar
GeirGrusom Skrevet 12. mai 2008 Del Skrevet 12. mai 2008 Genereres teksturen først og blir laget til et bitmap, for deretter å bli lastet på nytt, eller blir det bare generert et bitmap? Hvis du bare lager teksturen, og lagrer den til disk, uten å laste teksturen igjen fra disk, så vil du i så fall slippe det problemet. Lenke til kommentar
Zxiii Skrevet 12. mai 2008 Forfatter Del Skrevet 12. mai 2008 Du bør kansje laste opp kildekoden eller deler av den, om noen skal kunne hjelpe deg. Vanskelig å bare gjette seg til en slik feil. Beklager, jeg skal prøve å være mer spesifikk. Ved oppstart av programmet deklarerer jeg texturen: Texture2D skybox; Så oppretter jeg et bilde slik: System.Drawing.Bitmap bilde = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); Kjører en algoritme som fargelegger bildet slik: bilde.SetPixel(i, j, currentColor); Etter algoritmen er ferdig med å tegne bildet, lagrer jeg texturen med samme navn slik at den gamle texturen blir overskrevet: bilde.Save(folder + "skybox.png"); Jeg laster deretter texturen inn slik: skybox = content.Load<Texture2D>("skybox"); Texturen har jeg forsikret meg om er lagret på riktig plass i mappestrukturen. Under kjøring (Start Debugging) i VS 2005, fungerer alt fint, slik at den nyeste texture-filen mappes på kuben hver gang. Problemet kommer når jeg skal releasebuilde for å få en enkel kjørbar fil. Da vil ikke kuben mappes med den oppdaterte texturen lengre, den er liksom låst på den gamle. Jeg ser at programmet også i releasebuild lager en ny texture og bruker den til å overskrive den gamle texture-filen, men det som mappes til kuben er likevel den gamle texturen (altså den som er overskrevet og som faktisk ikke engang finnes lenger). Funky greier. Lenke til kommentar
GeirGrusom Skrevet 13. mai 2008 Del Skrevet 13. mai 2008 Problemet ligger nok i content.load. Sjekk at du ikke bruker current directory, men istedet bruker en mappe som er relativ i forhold til Application.StartupPath eller noe. Men er egentlig content.Load nødvendig? er det ikke mulig å lage en Texture2D fra en bitmap fil? skybox = new Texture2D(bilde) Hvilket grafikkbibliotek bruker du egentlig? Btw så er Bitmap.SetPixel en utrolig treg funksjon, og du kan unngå å bruke den med litt pekere og slikt public unsafe Bitmap GenerateTexture(int width, int height) { Bitmap ret = new Bitmap(width, height); BitmapData data = ret.Lock(new Rectangle(0, 0, width, height) ret.PixelFormat); uint* ptr = (uint*)data.Pointer.ToAddress(); for(int i = 0; i < width * height; i++, ptr++) { *ptr = (i & 0x3) << 14 | i << 8 | 0xff; } ret.Unlock(data); return ret; } (Helt eksempelvis, vet ikke om dette kompilerer engang) Lenke til kommentar
Zxiii Skrevet 13. mai 2008 Forfatter Del Skrevet 13. mai 2008 Problemet ligger nok i content.load.Sjekk at du ikke bruker current directory, men istedet bruker en mappe som er relativ i forhold til Application.StartupPath eller noe. Men er egentlig content.Load nødvendig? er det ikke mulig å lage en Texture2D fra en bitmap fil? skybox = new Texture2D(bilde) Hvilket grafikkbibliotek bruker du egentlig? Btw så er Bitmap.SetPixel en utrolig treg funksjon, og du kan unngå å bruke den med litt pekere og slikt public unsafe Bitmap GenerateTexture(int width, int height) { Bitmap ret = new Bitmap(width, height); BitmapData data = ret.Lock(new Rectangle(0, 0, width, height) ret.PixelFormat); uint* ptr = (uint*)data.Pointer.ToAddress(); for(int i = 0; i < width * height; i++, ptr++) { *ptr = (i & 0x3) << 14 | i << 8 | 0xff; } ret.Unlock(data); return ret; } (Helt eksempelvis, vet ikke om dette kompilerer engang) Selvsagt! Ved å kalle direkte på Texture2D.FromFile(); funksjonen, uten å bruke content.load, kan jeg enkelt laste inn bitmap filen uten å måtte inkludere den i prosjektet. Dermed slipper jeg også problemet med oppdatering, siden det alltid vil være ferskeste kopien som brukes. Testet dette, og det fungerer helt konge! ;D Mange takk! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå