webForumDet fria alternativet

Vad är det jag inte ser?

C/C++

4 svar · 281 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Edit// Det verkar som om problemet ligger i PlotPixel och inte denna funktion

Edit2// PlotPixel funkar hur fint som helst när den blir anropad av andra funktioner.... Det skumma är att PlotPixel får rätt färger skickade till sig men just när Gouraud funktionen anropar den blir det fel.... Vad f*n kan det vara?

void Rasterizer::PlotPixel(CVertex & P)
{
	int nBytesPerPixel = nColorDepth / 8;
	unsigned int offset = (P.y*(nViewportWidth)+P.x)*nBytesPerPixel;
	unsigned long nColor = (
		(F2B(P.a) << 24) |
		(F2B(P.r) << 16) |
		(F2B(P.g) << 8) |
		(F2B(P.b)));
	memcpy((lpbColorBuffers[nActiveColorBuffer]+offset), &nColor, 4);
}

----

Jag är medveten om att detta är en enorm kodsnutt att glutta igenom men jag hoppas att ni ändå orkar hjälpa mig. :)

Denna kod är i stort sett identisk med koden i avsnittet "Gouraud triangle" på http://www-users.mat.uni.torun.pl/~wrona/3d_tutor/tri_fillers.html. Trots det blir färgerna helt fel när jag testkör programmet. Jag skrev från början en liknande kod som lyckades få fram en helt OK gouraud skuggad triangel förutom att den hade en väldigt ful kant (vet ej varför).

Alla medlemsvariabler till CVertex klassen är floats.

Har gått igenom koden flera ånger nu men hittar inga olikheter, de som var har jag ändrat utan framgång. Någon som kan hjälpa mig hitta felet?

// Tog bort koden eftersom det inte är där problemet ligger
Medlem sedan aug. 20021 752 inlägg
#2

EDIT: FEL! Man ska inte svara på inlägg för tidigt på morgonen :)

Borde inte

memcpy((lpbColorBuffers[nActiveColorBuffer]+offset), &nColor, 4);

vara

memcpy((lpbColorBuffers[nActiveColorBuffer]+offset), nColor, 4);

Det är väll värdet som du vill kopiera och inte minnes adressen som jag tror du kopierar om du gör som du skrivit.

/Viktor

Medlem sedan maj 20002 993 inlägg
#3

Viktor,
memcopy tar en void-pekare som andra argument.

Detta verkar vara ett väldigt klurigt fel, alla funktioner funkar på vissa ställen de anropas men inte på andra. Funktionen InterpolateLine() använder också PlotPixel men för den funktionen funkar den perfa. Testade att rita en triangel med hjälp av att bara ange kordinaterna och färgerna (det funkar lite annorlunda annars), då fungerade det. Men lite senare testade jag samma sak igen (lite andra kordinater o färger) men då fungerade det inte.

Jag skall ladda upp koden lite senare så att ni får se på helheten :)

Medlem sedan maj 20002 993 inlägg
#4

Här är koden

Medlem sedan maj 20002 993 inlägg
#5

Problemet är löst! :D

unsigned int offset = (int(P.y+0.5)*(nViewportWidth)+int(P.x+0.5))*nBytesPerPixel;

Detta fixade det! Glömde att avrunda Kordinaterna innan jag räknade ut vart i minnet pixeln låg :r

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)