Suche Mathematiker der sich mit SoftwareRendering auskennt
-
Hallo,
in meinem letzten Beitrag in diesem Forum brauchte ich auch schon Hilfe zum Thema SoftwareRendering.
Da ich so schnell eine sehr gute Antwort bekahm dachte ich mir ich könnte hier einfach mal fragen ob es jemanden gibt der daran interessiert ist meinem Projekt bei zu treten und sich speziell mit dem SoftwareRenderer beschäftigt.
Mein Projekt ist OpenSource und hier: http://softpixelengine.sourceforge.net/index.html zu betrachten.
In meiner 3D Engine habe ich mit dem SoftwareRenderer schon angefangen und er ist im Grunde auch schon gar nicht mal so schlecht.
Aber irgendwo liegen auch meine Mathematischen Grenzen (somal ich gerade erst in der 12. Klasse bin)Das Wichtigste, das noch gemacht werden muss, ist:
die Funktion "SoftwareDriver::rayDrawTriangle" muss in 2 Dingen erweitert werden:
1. Die Tiefe jeden Pixels muss errechnet werden
2. Die Texture Koordinaten U und V jeden Pixels müssen errechnet werdenWeil dies ein Echtzeit SoftwareRenderer werden soll, müssen die Berechnungen so schnell wie möglich sein.
Hier ein kleiner Code Ausschnitt meiner DreiecksZeichnen Funktion:
s32 SoftwareDriver::rayCheckInsideScreen( dim::vector3df &Pos1, dim::vector3df &Pos2, dim::vector3df &Pos3, s32 &optyStart, s32 &optyEnd) { /* Temporary variable */ s32 Result = RAY_TRUE; optyStart = (s32)math::Min(Pos1.Y, Pos2.Y, Pos3.Y); optyEnd = (s32)math::Max(Pos1.Y, Pos2.Y, Pos3.Y); /* Check if the dimension is outside the screen */ if (optyStart < 0) { optyStart = 0; Result = RAY_FALSE; } if (optyEnd >= __Screen_Height) { optyEnd = __Screen_Height; Result = RAY_FALSE; } /* Return the result and exit function */ return Result; } /* * DrawTriangle function - version 3 */ void SoftwareDriver::rayDrawTriangle(dim::vector3df &Pos1, dim::vector3df &Pos2, dim::vector3df &Pos3) { /* Update matrix transformation */ matrixUpdate(); Pos1 = ModelviewMatrix_ * Pos1; Pos2 = ModelviewMatrix_ * Pos2; Pos3 = ModelviewMatrix_ * Pos3; Pos1.setOrigOGL(); Pos2.setOrigOGL(); Pos3.setOrigOGL(); /* Check if the z axis are behin the camera location */ if (Pos1.Z <= 0 || Pos2.Z <= 0 || Pos3.Z <= 0) return; /* Change to window coordinates */ Pos1.set2DValues(FieldOfView_); Pos2.set2DValues(FieldOfView_); Pos3.set2DValues(FieldOfView_); /* Check if the triangle is completely outside the screen */ if ( ( Pos1.X < 0 && Pos2.X < 0 && Pos3.X < 0 ) || ( Pos1.X > __Screen_Width && Pos2.X > __Screen_Width && Pos3.X > __Screen_Width ) || ( Pos1.Y < 0 && Pos2.Y < 0 && Pos3.Y < 0 ) || ( Pos1.Y > __Screen_Height && Pos2.Y > __Screen_Height && Pos3.Y > __Screen_Height ) ) { return; } /* Check the render mode */ if (RenderMode_ != RAY_RENDER_BOTH) { /* Calculate if the triangle is drawn in the clock- or counter clock wise */ f32 d = (Pos2.X - Pos1.X)*(Pos3.Y - Pos1.Y) - (Pos2.Y - Pos1.Y)*(Pos3.X - Pos1.X); /* Check the value */ if ( ( RenderMode_ == RAY_RENDER_FRONT && d <= 0.0f ) || ( RenderMode_ == RAY_RENDER_BACK && d >= 0.0f ) ) return; } /* Sort height (y axis) */ if (Pos1.Y > Pos2.Y) math::Swap(Pos1, Pos2); if (Pos1.Y > Pos3.Y) math::Swap(Pos1, Pos3); if (Pos2.Y > Pos3.Y) math::Swap(Pos2, Pos3); s32 optxStart, optxEnd; s32 optyStart, optyEnd; /* Check if the coordinates are inside the screen */ rayCheckInsideScreen(Pos1, Pos2, Pos3, optyStart, optyEnd); /* Temporary variables */ s32 yStart = (s32)Pos1.Y; s32 yMiddle = (s32)Pos2.Y; s32 yEnd = (s32)Pos3.Y; s32 xStart, xEnd; s32 x, y, i, j; f32 z = Pos1.Z; /* Calculate the dimensions */ s32 yMiddleStart = yMiddle - yStart; s32 yEndMiddle = yEnd - yMiddle; s32 yEndStart = yEnd - yStart; /* Loop for all lines */ for (y = optyStart; y < optyEnd; ++y) { /* Determine the line range start */ if (y < yMiddle) xStart = s32( Pos1.X + ( Pos2.X - Pos1.X ) * ( y - yStart ) / yMiddleStart ); else if (y > yMiddle) xStart = s32( Pos2.X + ( Pos3.X - Pos2.X ) * ( y - yMiddle ) / yEndMiddle ); else xStart = s32( Pos2.X ); /* Determine the line range end */ xEnd = s32( Pos1.X + ( Pos3.X - Pos1.X ) * ( y - yStart ) / yEndStart ); /* Sort the range */ if (xStart > xEnd) math::Swap(xStart, xEnd); /* Determine the optimized x start- & end location */ optxStart = (xStart < 0 ? 0 : xStart); optxEnd = (xEnd >= __Screen_Width ? __Screen_Width : xEnd); /* Loop for all pixel in the current line */ for (x = optxStart; x < optxEnd; ++x) { rayPlot(i, x, y, z, CurColor_.r, CurColor_.g, CurColor_.b, CurColor_.a); } } // next lines }
Wer sich Interesse daran hat meinem Team bei zutreten möge sich hier oder über meine EMail (siehe: http://softpixelengine.sourceforge.net/sp_impressum.html) melden.
PS: Wer dem Team beitritt und die Engine diesbezüglich verbessern kann wird natürlich auch meiner Homepage unter "Credits" als Teammitglied erwäht
Gruß Lukas
-
Hier sind auch schon mal zwei Bilder zum bisherigen SoftwareRenderer:
-
wieso benutzt du nicht mesa oder einen der anderen freien rasterizer?
-
LukasBanana schrieb:
Weil dies ein Echtzeit SoftwareRenderer werden soll, müssen die Berechnungen so schnell wie möglich sein.
Mir erschließt sich der Sinn eines Software Renderers nicht mehr.
Heute in Zeiten von Hardware beschleunigtem OpenGL und Direct3d werden Software Renderer doch gar nicht mehr benutzt.
Auch nicht mehr in embedded Hardware, denn dafür gibt es OpenGL ES und stromsparende 3d Hardwarechips wie z.b. den von PowerVR.Daß dein Ding auch zum Teil ne Engine darstellt die OpenGL verwenden kann ist ja ganz sinnvoll, aber warum brauchst du nen Software Renderer?
Ach ja und ehe ich es vergesse.
Wo bekomme ich dieses Porno 3d Modell her?
http://softpixelengine.sourceforge.net/GalleryImg20b.JPG
-
Hi Lukas. Ich kenne dich noch aus dem PB-Forum.
Das war jetzt grad Zufall, dass ich diesen Thread hier gefunden habe.Ich habe mir dein Projekt noch nicht genau angeschaut. Wie du vielleicht weißt, hatte ich ja mal in PB den Raytracer geschrieben. Was also Vektorrechnung angeht, könnte ich dir da behilflich sein. Ansonsten fange ich aber gerade erst mit C++ an und entwickle damit unter Linux. Gib Bescheid, wenn ich dir noch irgendwo helfen kann.