Gå til innhold

Anbefalte innlegg

Leeenge siden jeg har drevet med grafikkprogrammering på pixelnivå nå... Moro å leke litt :)

 

Gjorde noen endringer på din versjon:

* 512x512 istedenfor 128x128

* 32bits (gadd ikke teste, men tror dette går endel raskere pga. optimalisering i både memcpy og blur)

* Litt større tekst, men gradient farger, som beveger seg...

* Fikset bug'ene

* Fjernet timer'n

* Fjernet bildet. Skriver heller rett på formen. La til doublebuffer.

 

står fortsatt "GeirGrusom" i teksten :w00t:

 

 

Hastigheten er bra på min 1.1ghz tabletpc med elendig skjermkort... :thumbup:

HardCoreDrawing___j0rn.zip

Endret av jorn79
Lenke til kommentar
Videoannonse
Annonse

HAHA!

Morsomt! :)

 

Uansett, jeg fant ut hvordan jeg hadde gjort det i orginal programmet... det er ikke rart det ikke fungerte.

Der allokerte jeg et minneområde som var én pixel større i alle retninger, for at blur skulle gi et riktig resultat (ellers blir det en mørk kant rundt hele bildet) og for å slippe å teste noe som helst.

 

Du gjorde koden veldig mye bedre, jorn :thumbup:

Lenke til kommentar
  • 2 uker senere...

Bruker dette nå til å lage en software renderer i C#

Jeg har nå implementert Z-Buffer, effektiv tegning av linjer, og 3D transformering...nå er det på tide å fylle polygoner.

Derfor trenger jeg en effektiv funksjon til linje-interpolering, siden jeg ikke har tatt matematikk selv, så aner jeg ikke hvordand ette gjøres, og er ikke smart nok til å finne ut av det selv.

Hjelp?

Lenke til kommentar
Unnskyld,

Jeg har en linjetegnefunksjon, som ikke bruker deling i det hele tatt... det jeg trenger er en funksjon for å finne X hvor jeg vet Y

X = ((Y / )... ??

Forstår?

 

Jeg blir litt svimmel av å lese koden for å fylle polygoner, så jeg tenkte å lage det selv.

 

Men takk for svar :)

7375499[/snapback]

 

Hvordan tegner du linjer uten å dele?

 

 

X = StartX + (Y-StartY) * (SluttX - StartX) / (SluttY - StartY)

 

Men du trenger jo bare å gjøre dette en gang. Og så pluss på X for hver gang Y øker. På samme måte som det gjøres med X i eksmpelet mitt gjøres også med TX,TY (Texture X,Y) og GR,GG,GB (Gouraud Red, Green Blue). :)

Endret av jorn79
Lenke til kommentar
Hvordan tegner du linjer uten å dele?

Sånn (rett ut fra programmet):

public void DrawLine(int x1, int y1, int z1, int x2, int y2, int z2, Color color)
 {
 	int i, dx, dy, dz, sdx, sdy, sdz, dxabs, dyabs, dzabs, x, y, z, px, py, pz;

 	dx = x2 - x1;      /* the horizontal distance of the line */
 	dy = y2 - y1;      /* the vertical distance of the line */
 	dz = z2 - z1;
 	dxabs = Math.Abs(dx);
 	dyabs = Math.Abs(dy);
 	dzabs = Math.Abs(dz);
 	sdx = Math.Sign(dx);
 	sdy = Math.Sign(dy);
 	sdz = Math.Sign(dz);
 	x = dyabs >> 1;
 	y = dxabs >> 1;
 	z = dzabs >> 1;
 	px = x1;
 	py = y1;
 	pz = z1;

 	if (dxabs >= dyabs) // the line is more horizontal than vertical
 	{
   for (i = 0; i < dxabs; i++)
   {
   	y += dyabs;
   	if (y >= dxabs)
   	{
     y -= dxabs;
     py += sdy;
   	}
   	px += sdx;
   	pz += sdz;
   	SetPixel(px, py, (short)pz, color);
   }
 	}
 	else // the line is more vertical than horizontal
 	{
   for (i = 0; i < dyabs; i++)
   {
   	x += dxabs;
   	if (x >= dyabs)
   	{
     x -= dyabs;
     px += sdx;
   	}
   	py += sdy;
   	pz += sdz;
   	SetPixel(px, py, (short)pz, color);
   }
 	}
 }

Bresenham's line algorithm

Xiaolin Wu's line algorithm

Alle Z variablene kan du fjerne, det er for Z-bufferet.

Endret av GeirGrusom
Lenke til kommentar

Holder på med et lite program for de som har mange filmer lagret på harddisken. Bare for gøy, så bruker jeg LINQ som gjør det ganske enkelt å gjøre en hel masse smugt. Som f.eks:

 

Her er "movies" en List<Movie>, og man bruker from, select og where som i SQL for å hente ut alle elementene og bygge opp et slags XML-tre.

XElement movieXml =
new XElement("movies",
   from movie in movies
   select
   new XElement("movie",
       new XElement("title", movie.Info.Title),
       new XElement("year", movie.Info.Year),
       new XElement("rating", movie.Info.Rating),
       new XElement("runtime", movie.Info.Runtime),
       new XElement("plotoutline", movie.Info.PlotOutline)
       ...

 

Her er et eksempel fra et sted i koden hvor bruker har søkt etter tittel på en film, og man ønsker å returnere de filmene som matcher.

case SearchType.Title:
   var titleq = from movie in movies
       where movie.Info.Title.Contains(searchPattern)
       select movie;
   return titleq.ToList();

 

Ganske fiffig. var blir den typen som query'en resulterer i. Så var x = "eple" er det samme som string x = "eple". Går akkurat like fort for all ze magic skjer når man kompilerer :)

Lenke til kommentar
Hvor mye mer effektivt er dette i forhold til den innebygde funksjonen for tegning av linjer? Eller for den saks skyld å bruke enkel divisjon som i jorn79's eksempel?

7384446[/snapback]

 

Poenget er vel å leke seg og ikke bruke de innebygde funksjonene. Idag er det nok mye mer effektivt å bruke DirectX og 3D-kortet for å gjøre sånt :)

 

 

Jeg ville satset på at den er mindre effektiv. Greit nok at man slipper en DIV. Men man får jo mye mer å gjøre i inner-loop'en...

 

Uansett så er ikke koden jeg skrev spesielt for å tegne linjer. Det er for å regne ut/interpolere hver side av et triangel. Man tegner polygonene alltid en og en linje Y. Og interpolerer slik jeg har gjordt for å finne X, TX, TY(texturekoordinater) og GR,GG,GB (gouraud).

 

Da sitter man igjen med:

Y (kun 1, siden den er felles for begge sider)

X1, X2 ( start X og slutt X)

TX1, TX2, TY2...etc

 

Så tegner man en rett linje fra (X1,Y,X2,Y). Hvor man igjen må interpolere TX1,TX2,TY1,TY2 (for å finne texturekoorinater) og GR1,GR2,GG1..etc (gouraud).

 

Begynner vel å bli over 10 år siden jeg satt å kodet dette her i x86 asm nå. *drømmer seg tilbake* ;)

Endret av jorn79
Lenke til kommentar

Hehe, har aldri gjort det før egentlig, har bare laget 3D med linjer, og det begynner å bli litt døvt.

Men jeg har lest to ting:

At divisjon er den tregeste instruksjonen i prosessoren, og at Bresenhams algoritme er den raskeste; så det så!

 

Men uansett; her er den eneste måten jeg kunne tenke ut for å fylle polygoner:

post-31659-1164817248_thumb.png

 

Forresten; stilig program ezb1 :thumbup:

Veldig elegant, samme gjelder forresten websiden din :)

 

Men jeg får ikke downloadene til å fungere, hverken i ie eller ff.

Endret av GeirGrusom
Lenke til kommentar
Forresten; stilig program ezb1  :thumbup:

Veldig elegant, samme gjelder forresten websiden din :)

 

Men jeg får ikke downloadene til å fungere, hverken i ie eller ff.

7386188[/snapback]

 

Takker så meget. Har nettopp begynt på det, så har bare tatt form de siste dagene.

La opp filene nå, men ikke skyld på meg hvis noe begynner å ryke :)

Endret av ezb1
Lenke til kommentar
Wow! fikk brukt det nå, kjempetøft! :thumbup:

Den bruker litt lang tid på å få tak i detaljer, men det er kanskje ikke så rart.

supert program!

7391330[/snapback]

Bruker litt tid ja, men kommer mye an på hva slags linje du har. Har gjort om litt nå, så du kan velge hvor mange imdb-threads som brukes samtidig. Går ganske mye fortere :)

Lenke til kommentar
  • 3 uker senere...

Jeg holder nå på med et OpenGL framework skrevet 100% i C#, så jeg tenkte å legge opp en liten demo på den nå (som kanskje blir et spill etterhvert?)

 

Hvis dere vil prøve frameworket (som ikke er i nærheten av ferdig) så kan dere reference til glorg.dll som ligger i zip-filen.

 

Escape avslutter.

 

Have phun

 

NB: Jeg vet at stjernene ikke fungrer helt.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...