Software Rasterizer

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Hellhound_66
Beiträge: 2
Registriert: 30.01.2012 17:54

Software Rasterizer

Beitrag von Hellhound_66 »

Hallo PB-Community.

Ich habe einen Software Rasterizer geschrieben, der Z-Buffering und bilineares Filter unterstützt.
Den Code habe ich in der Development Lounge gepostet. Sollte ich hier wegen Querpostings gegen Nutzungsrichtlinien verstoßen, bitte ich das zu entschuldigen.
Da der Rasterizer Multithreaded ist und auf Sprite-Surfaces schreibt, muss man zwingend "Threadsafe" einschalten, ansonsten wird er abstürzen. Ihr könnt aber auch einfach das Multithreading wieder rausbauen.

Da der Code nicht kommentiert ist, beantworte ich gerne Fragen, die sich aus dem Code heraus ergeben. Man möge mir aber eine längere Antwortzeit nachsehen.

Weitere Infos stehen aber auch im Originalthread.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Software Rasterizer

Beitrag von c4s »

Hm, also bei mir sieht das ganze so aus:
Bild
:|
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Software Rasterizer

Beitrag von STARGÅTE »

Wäre schön wenn ich überhaupt was sehen könnte, ich bekomme mit Debugger eine IMA:

Code: Alles auswählen

Procedure Render(*info.RenderInfo)
    Protected *Triangle.Triangle = *info\Triangle
    Protected *Texture.TextureRGBA = *info\Texture
    
    Protected transformed.Triangle2D
    TransformTo2D(transformed, *Triangle)  ; << Hier
    ; [..]
ohne sieht es so aus:
Bild
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Hellhound_66
Beiträge: 2
Registriert: 30.01.2012 17:54

Re: Software Rasterizer

Beitrag von Hellhound_66 »

Danke für das Feedback.
Das Bild von c4s kann ich nicht nachvollziehen ;-). Kann sein, dass sich da noch irgendwo ein IMA versteckt hat. Zumindest aber auf meinem System hier (Win7 64Bit, QuadCore, NVIDIA) läuft es so wie bei Stargate.

Das unterste Bild von Stargate ist schon richtig. Die Quadrate werden absichtlich übereinander und ineinander dargestellt, um das Z-Buffering zu demonstrieren. Clevererweise hätte ich auch eine vernünftigere Ausgabe wählen können. Mit der [1]-Taste kann man das bilineare Filter zuschalten.

Ich gehe davon aus, dass man aufgrund des Threadings keinen Debugger mitlaufen lassen kann. Ich muss zugeben, dass ich das Multithreading noch nachträglich hinzugefügt habe. Vorher lief es auch im Debugger ohne Probleme.

Spaßeshalber könnt ihr ja mal das Multithreading herausmachen.
In der Methode

Code: Alles auswählen

Procedure DrawTriangle(*Triangle.Triangle, *Texture.TextureRGBA)
    Dim infos.RenderInfo(#THREADS-1)
    Protected i.i
    For i = 0 To #THREADS - 1
        infos(i)\Threads = #THREADS
        infos(i)\offset = i
        infos(i)\Triangle = *Triangle
        infos(i)\Texture = *Texture
        infos(i)\ThreadID = CreateThread(@Render(), infos(i))
    Next
    For i = 0 To #THREADS - 1
        WaitThread(infos(i)\ThreadID)
    Next
   
EndProcedure
sollte es mit der Änderung (ich kann es hier nicht testen, sorry)

Code: Alles auswählen

Procedure DrawTriangle(*Triangle.Triangle, *Texture.TextureRGBA)
    Dim infos.RenderInfo(#THREADS-1)
    Protected i.i
    For i = 0 To #THREADS - 1
        infos(i)\Threads = #THREADS
        infos(i)\offset = i
        infos(i)\Triangle = *Triangle
        infos(i)\Texture = *Texture
        Render(infos(i))
    Next
EndProcedure
funktionieren.
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Software Rasterizer

Beitrag von DarkDragon »

Hallo,

Sieht gut aus, läuft hier auch mit Debugger einwandfrei (Windows 7, 64bit, PB 4.60). Ist nur etwas langsam, aber das stört ja erstmal nicht.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten