Hallo Dozgon,
bei der Rasterung ist die Grundidee: Lade eine Menge von Dreiecken und Texturen in den Speicher, lege fest welche Shader verwendet werden sollen und parametrisiere die Shader und anderen Bauteile der Grafikpipeline. Dann rufe nur noch den Zeichenbefehl auf um das Dreiecksarray zu zeichnen. Dann wird das Array mit dem Painter-Algorithmus gemalt (Schleife geht über alle Dreiecke).
Beim Raytracing iteriert man nicht über eine gegebene Menge von Objekten/Fragmenten/Dreiecken/Linien sondern man iteriert über alle Pixel und bestimmt dessen Farbwert, indem man schaut, welches Objekt durch diesen Pixel betrachtet wird. Es gibt zwei Grundsätze beim Raytracing: Strahlen von der Kamera aus erzeugen und dann durch die Scene verfolgen (Pathtracing) und Strahlen von der Lichtquelle erzeugen und durch die Scene verfolgen (Lighttracing).
Vom Design her würde ich mich beim Rasterizer an der Grafikpipeline(https://de.wikipedia.org/wiki/Grafikpipeline#/media/Datei:3D-Pipeline.png / http://www.songho.ca/opengl/gl_transform.html) orientieren.
D.h. du hast erstmal Klassen zum Speichern von Texturen und Dreiecken. Mit 4*4-Matrizen (Model * Kamera * Projektion) transformierst du alle Dreiecke vom Objektspace in Clippingkoordinaten. Das macht der Vertexshader, welcher eine Callbackfunktion ist, um ihn frei austauschbar zu machen. Für das Clipping hast du dann eine eigene Klasse, um aus ein Dreieck dann eine Liste von Dreiecken zu machen. Dann die Division durch W für jeden Vertex. Für die Viewporttransformation hast du auch eine eigene Klasse, um die Dreiecke in 2D-Dreiecke zu bringen, welche in Pixelkoordinaten vorliegen.
Dann hast du eine Triangle-Raster-Klasse, welche als Input ein 2D-Dreieck bekommt und was dann für jedes Pixel, was innerhalb vom Dreieck liegt ein Callback-Handler aufruft. Innerhalb von diesen Callbackhandler wird dann erst der PixelShader um die Farbe zu bestimmen. Dann noch das Zeichnen in den Farb- und Tiefenpuffer.
Du brauchst also mindestens die Klassen: ColorTexture, DepthTexture, Buffer (Enthält eine Farb- und Tiefentextur), TriangleRasterizer, VertexShader, PixelShader, Matrix4x4, Vertex, Vector3D, Clipping.
Beim Raytracer konvertiert man alle Dreiecke/Objekte auch erst vom Objektspace in den World- oder Kamera-Space. Man könnte das dort auch Vertexshader nennen, wenn man das will. Aber ab da kannst du es nicht mehr mit einer Grafikpipeline vergleichen. Du schickst ja keine Dreiecke durch eine Pipeline, wo am Ende dann ein Farbpuffer wartet sondern du ermittelst für jeden Pixel den Schnittpunkt mit dem ersten Dreieck.
Die Gemeinsamkeit zwischen Rasterizer und Raytracer ist also, dass beide eine Menge von Dreiecken, Lichtquellen und eine Kamera als Input bekommen und beide ein Bild erzeugen. Der Teil dazwischen muss dann unterschiedlich implementiert werden.