Gå til innhold

Anbefalte innlegg

Sliter litt med teksturering av terreng/veier i DirectX. Håper noen har vært borti tilsvarende problemstillinger. Har en mistanke om hvem som vet dette :yes:

 

Merk at ting fungerer! Det ser bare grusomt stygt ut!

 

Jeg skal tegne ut en liste med triangler. Jeg bruker CustomVertex.PositionColoredTextured[] typen og setter Tu/Tv mapping parameterene slik

                   if (teller == 1)
                   {
                       triangleList[i].Tu = 0;
                       triangleList[i].Tv = 0;
                   }
                   if (teller == 2)
                   {
                       triangleList[i].Tu = 0;
                       triangleList[i].Tv = 1;
                   }
                   if (teller == 3)
                   {
                       triangleList[i].Tu = 1;
                       triangleList[i].Tv = 1;
                   }

 

Trianglene blir tegnet ut med

  
device.DrawUserPrimitives(PrimitiveType.TriangleList, triangleList.Length / 3, triangleList);

 

Problemet er at:

  • Jeg har ingen anelse hvordan trianglene ser ut. Formene kan være forskjellig. En sidekant kan være 20 cm den andre 5 meter den tredje 1 meter. Eller 1/1/1 i andre settinger.
  • I dag blir teksturen "dratt" og endret i for å passe til triangelets form. Jeg ønsker ideelt sett at teksturen skal "tiles". Dvs legges ved siden av hverandre og dermed aldri skaleres eller strekkes forskjellig. Jeg ønsker en jevn overflate uten kanter etc. Er dette mulig å få til?

 

Noen idéer?

Lenke til kommentar
Videoannonse
Annonse
triangleList.Length / 3

Jeg vet ikke om dette er ritktig, for det hender jeg blander OpenGL og DirectX. I OpenGL ihvertfall så skal det bare stå triangleList.Length der, men det er noe usikkerhet fra min side om dette gjelder i Direct3D også.

 

Jeg går forøvrig utifra du bruker SlimDX og ikke Managed DirectX? Hvis ikke, bytt til SlimDX.

 

Du kan lett lage en "world" koordinat utifra vertexen sin position. hvis det bare skal mappes rett ovenifra, vil dette se greit ut. Altså sett x og z på Tu og Tv.

Lenke til kommentar

Selve uttegningen av trianglene fungerer 100%. Dette vet jeg ikke er noen problemer med.

 

Kremt :whistle: Bruker nok (dessverre) Managed DirectX. Har også vurdert XNA. Hva er grunnen til at jeg bør bytte til SlimDX?

 

Tu/Tv må ligge mellom -1 og 1.Eller tar jeg feil? (Har bommet litt med dette.T rodde det var 0-1, skal teste dette i morgen).

Har uansett prøvd å sette TuTv til faktiske posisjoner. Fikk problemer med dette tidligere i dag. Men skal undersøke nærmere i morgen og se om jeg gjorde noe galt

Endret av OleM80
Lenke til kommentar

Ok. Managed DirectX er veldig utdatert. SlimDX er rett og slett DirectX wrappet til .NET. Managed DirectX er et eget API som ligner på DirectX. Det fungerer ikke under 64-bit, og har noen problemer (for eksempel må du skru av LoaderLockException for å bruke DirectX.AudioVideoPlayback)

 

Teksturkoordinater blir mappet til 0-1, men du kan bestemme hvordan dette skal foregå. (om det skal være repeat, eller om verdier mindre enn 0 skal mappes til 0 osv. Standard er repeat)

Eventuelt kan du selv regne ut en korrekt verdi mellom 0 og 1, men i teorien skal dette gå automatisk.

 

Men kikk på SlimDX. Fordelen da er også at Direct3D tutorials for C++ skal være mer eller mindre korrekt for SlimDX.

 

Merk at Direct3D 10 og Direct3D 11 har gått fullstendig bortifra programmering uten shaders (altså såkalt fixed function er ikke tilgjengelig). Det er ikke noen funksjon i Direct3D 10 for point sprites for eksempel, dette er noe du må lages selv med en Geometry Shader.

Men du har også valget å bruke Direct3D 9.0c i SlimDX.

Lenke til kommentar

Ok. Managed DirectX er veldig utdatert. SlimDX er rett og slett DirectX wrappet til .NET. Managed DirectX er et eget API som ligner på DirectX. Det fungerer ikke under 64-bit, og har noen problemer (for eksempel må du skru av LoaderLockException for å bruke DirectX.AudioVideoPlayback)

 

Teksturkoordinater blir mappet til 0-1, men du kan bestemme hvordan dette skal foregå. (om det skal være repeat, eller om verdier mindre enn 0 skal mappes til 0 osv. Standard er repeat)

Eventuelt kan du selv regne ut en korrekt verdi mellom 0 og 1, men i teorien skal dette gå automatisk.

 

Men kikk på SlimDX. Fordelen da er også at Direct3D tutorials for C++ skal være mer eller mindre korrekt for SlimDX.

 

Merk at Direct3D 10 og Direct3D 11 har gått fullstendig bortifra programmering uten shaders (altså såkalt fixed function er ikke tilgjengelig). Det er ikke noen funksjon i Direct3D 10 for point sprites for eksempel, dette er noe du må lages selv med en Geometry Shader.

Men du har også valget å bruke Direct3D 9.0c i SlimDX.

 

Jeg er dessverre helt avhengig av at programmet KAN kjøres på 64 bit. Ikke nødvendigvis med 64 bit støtte men det må være kjørbart(Det her er ikke min sterke side :) ).

 

Finner ingen plass i DirectX der jeg kan styre repeat (Har funnet dette i OpenGL). Dermed ser overflaten ut som et lappeteppe. Finner ingen enkel måte å gjøre dette på med Tu/Tv. Har forsøkt modulo operasjoner, men dette blir heller ikke riktig. (Jeg kan gjøre en antakelse om at sidekantene normalt er mindre enn f.eks. 2.5 meter)

 

I forhold til de siste tingene du snakker om så blir dette litt "abstrkt" for meg foreløpig. Er litt Noob i DX/Grafikk men har laget en funksjonell grafikk som faktisk fungerer. Nå er målet å få det til å få en freshere look enn et tidlig 90 talls spill :) Men skjønner ikke helt det her med teksturering.

 

Hvis en ikke har noe godt svar på repeat/tiling spørsmålet:

La oss vri på det. Finnes det et bedre alternativ? Jeg har N antall punkter. Disse triangulerer jeg på utsiden av DX(dette har med business logikken å gjøre). Og jeg vet hvilken tekstur hvert triangel bør ha. Hvordan gjør jeg dette slik at jeg får en jevn og fin overflate. Finnes der andre måter å bruke teksturer på?

Lenke til kommentar

Du er sikker på at det ikke bare er skalaen som er gal?

hvis du lager en overflate som er 500 unit stor, så skal teksturen repeteres 500 ganger over overflaten (hvis du setter koordinatene slik som jeg skrev)

Da kan du ende opp med kun et moiré-mønster.

 

Modulo bør funke, men det skal ikke ha noen som helst effekt dersom Direct3D allerede gjør jobben for deg.

Lenke til kommentar

Du er sikker på at det ikke bare er skalaen som er gal?

hvis du lager en overflate som er 500 unit stor, så skal teksturen repeteres 500 ganger over overflaten (hvis du setter koordinatene slik som jeg skrev)

Da kan du ende opp med kun et moiré-mønster.

 

Modulo bør funke, men det skal ikke ha noen som helst effekt dersom Direct3D allerede gjør jobben for deg.

Hm. Modellen min kan bli opp i ca 12000m/3000m. Gjør ingen skalering hverken på denne eller teksturen.

Teksturen min(en vei/asfalt tekstur) kan passe på en flate på ca 2x2 meter.

 

Dersom et triangel starter til venstre på teksturen og høyre side av triangelet blir til høyre på tekstur etc går det fint.

MEN

Hvis triangelets "venstre" punkt ligger med en Tu på f.eks. 0.99 så har den et nytt punkt rett ved siden av så får dette Tu -0.99. Dette betyr av 1.98/2 av teksturbredde blir brukt på et kjempesmalt triangel som bare burde hatt 0.02/2 deler av teksturen. Dermed blir teksturen vridd og vrengt.

Dårlig å forklare her med tipper du skjønner hva jeg mener.

 

Trenger da vel ikke en tekstur som skal dekke 12000x3000 m landskap? Kan da vel gjenbruke en tekstur og bruke opp igjen denne?

 

Hvordan mener du jeg evt. bør scale for å få til dette?

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...