Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.04.2011, 17:03

Alte Spiele(Doom1, DK2): Softwarerenderer: Depthmap oder nur painteralgorythmus?

Tag allerseits.
Was mir mal heute so in den Kopf kam:

Für alte spiele gibt es(oder später durch port) oft auch noch einen Softwarerenderer. Besonders bei spielen die einen von anfang an haben(DK2), muss natürlich mit den damaligen resourcen gerechnet worden sein. Wird bei so einem Softwarerenderer dann ne richtige Depthmap oder ein PAinterAlgorythmus verwendet?

MFG
Memnarch
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

15.04.2011, 19:38

Nunja, quake z.B. kann dank BSP zumindest die Maps theoretisch ohne Overdraw rendern. Was den Rest angeht ist das schwer zu sagen um ehrlich zu sein. Früher hat man afaik tatsächlich noch mit Visibility-Algorithmen auf Ebene von Primitiven gearbeitet da die Rasterisierung am meisten Performance gefressen hat. Damals hat man eben auch versucht möglichst ohne Overdraw zu arbeiten und solche Dinge, da jeder Pixel der berechnet und dann übermalt wurde vergeudete CPU Cycles bedeutet hat. Heute wird man einfach einen Depth-Buffer verwenden. Depth-Buffering ist übrigens auch einfach sowas wie ein Painters-Algorithmus, nur eben auf Pixelebene ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (15.04.2011, 19:50)


3

15.04.2011, 22:21

Joar, nur nölt mir mein Softwarerenderer mit Pixelbasiertem DepthBuffer auf 1.5ghz ab. 512*512pixel. eine einzige fläche die alles bedeckt ergibt gerade mal 20-30fps. Komm da bei einigen sahcne nicht so weiter mit der optimierung. Und ein panterly wäre vllt für simple sachen hier garnicht mal soo schlecht.

MFG
Memnarch
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.04.2011, 22:33

Ist denn tatsächlich das Depth-Buffering dein Bottleneck? Wie hast du das denn gemessen? Und warum denkst du dass du mit einem Painters-Algo da was rausholen kannst? So ein Painters-Algo der wirklich mit allem zurechtkommt was man ihm reinwirft klingt am Papier vielleicht ganz nett, kann aber in der Umsetzung wirklich anstregend sein, das kannst du mir glauben. Einfach nur locker irgendwie Sortieren is da nämlich leider nicht, da heißts evtl. Primitive zerteilen, Floating Point Issues, ... ich hatte echt schon mehr Spaß ;)

Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von »dot« (15.04.2011, 23:29)


5

16.04.2011, 22:20

das Depthbuffering ist es indirect. Eigentlich ist es das interpolieren einer position A auf einem dreieck B der ecken CDE >.<.

Muss da immer noch nen Divide(genauer 3) benutzen. Da knallt die FPS zu boden. Nehm ich diese 3 Divides raus(pro pixel) schwups über 100fps(auch bis zu 200fps, allerdings alles nur reine füllgeschwindigkeit, ohne tiefen berücksichtigung). Ok also eher ein mathematisches problem.

Hatte hier irgendwo in nem andern thread geschrieben, auf welcher basis ich meinen rasterizer schreibe(ich such gleichmal link >.<). In einem der posts von dem ich den rasterizer her hab, stand auch wie man die Interpolationsformel so aufstellt, dass durch addieren vorkalkulierter werte ohne jegliche division entlang des dreiecks interpoliert werden kann.

Leider ist das resultat nicht gerade..überzeugend(die darstellung ist verfälscht). Da mach ich irgendwas falsch. Habe nich durchgehend an dem problem gearbeitet weil ich auf der arbeit ja auch noch anderes zu tun hab^^, aber es nervt dieses problem. Gab auch nochn paar andere fragen diesbezüglich zu denen ich keine antworten finden konnte.

PS: @Dot: du hast den Painterly schonmal benutzt? gibt irgendwo nen resultat?^^


MFG
Memnarch
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

17.04.2011, 00:22

das Depthbuffering ist es indirect. Eigentlich ist es das interpolieren einer position A auf einem dreieck B der ecken CDE >.<.

Muss da immer noch nen Divide(genauer 3) benutzen. Da knallt die FPS zu boden. Nehm ich diese 3 Divides raus(pro pixel) schwups über 100fps(auch bis zu 200fps, allerdings alles nur reine füllgeschwindigkeit, ohne tiefen berücksichtigung). Ok also eher ein mathematisches problem.

Naja dann zeig doch mal was du da genau treibst. Klingt für mich jedenfalls nicht wirklich als wär das Depth-Buffering dein Problem.

PS: @Dot: du hast den Painterly schonmal benutzt? gibt irgendwo

Das war nichts besondres, nur eine Aufgabe für eine Vorlesungsübung für die ich zuständig war. Dabei sollte ein sehr einfacher Vektor-Renderer entwickelt werden wobei eben der verlinkte Depth-Sort-Algorithmus zum Einsatz kam. Jedenfalls bezweifle ich sehr dass du mit so einem Depth-Sort auf Ebene von Primitiven irgendwo Performance gut machen kannst, im Gegenteil. Ein solcher Depth-Sort bietet evtl. minimale Vorteile bei extrem einfachen Szenen die aus sehr wenigen großen Dreiecken bestehen. Ab einer gewissen Menge an Dreiecken würde ich mir jedoch erwarten dass der Depth-Buffer dem Primitive-basierten Depth-Sort im Allgemeinen bei weitem überlegen ist, sofern du nicht irgendwelche wesentlich komplexeren Visibility-Algorithmen wie z.B. BSP und PVS oder was auch immer verwendest, wobei die meisten davon auch nur für statische Szenen (Levelgeometrie) brauchbar sind.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (17.04.2011, 00:38)


7

17.04.2011, 23:04

also für das Depthbuffering muss ich ja berechnen, welchen ZWert ein belibieger punkt in einem dreieck hat.
Dafür berechne ich(wenn p bein Punkt im Dreieck ABC ist) die flächen von

PAB, PBC, PCA, sowie die fläche ABC. Teile ich nun(hier mein Divide) die subflächen durch ABC erhalte ich den prozentualen anteil der fläche an der gesamtfläche, also die baryzentrischen koordinaten. Damit kann ich ja nun den ZWert der punkte ABC so multiplizieren, dass ich den ZWert am punkt P herausbekomme.

Der Softwarerasterizer selbst ist von hier:


Advanced Rasterization

Hatte vorher angefangen einen von grundauf zu schreiben. der war allerdings etwas langsam, dann hab ich obigen gefunden und dadurch was dazu gelernt^^(hoffe ichXD)
Im selben Thread weiterhinten steht auch was zur interpolation:

Interpolation

Das kalkulieren kann ich auch, der formel folgen ist nicht das problem. Aber das endergebnis ist etwas verfälscht. Muss ich z.B hier die normalen von den Welt oder View transformierten flächen berechnen?

Leider kann ich keinen genauen SourceCode liefern. Den hab ich während ich ein wenig freie zeit auf meiner ausbildungstselle hatte geschrieben. Und ist somit unter verschluss.(ich komme zwar dran, aber es darf nichts raus)


MFG
Memnarch
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

18.04.2011, 01:13

Ok, ich wollte grad schreiben "verwend die Ebenengleichung" als ich deinen zweiten Link gesehn hab ;)

Ich vermute mal dass es dir aber auch gar nichtmehr um die z-Interpolation geht sondern um beliebige Vertex-Attribute (Texturkoordinaten, etc.)!? Wenn ja dann vermute ich dein Problem ist dass du einfach das Attribut linear interpolierst, was aber perspektivisch nicht korrekt ist (bedenke dass dein Dreieck auf dem Weg in den Screenspace einer nichtlinearen Transformation unterworfen wurde). Um perspektivisch korrekt unterwegs zu sein musst du den Wert Attribut/z linear interpolieren und dann mit der Tiefe an der entsprechenden Stelle multiplizieren um das z wieder rauszubekommen. Da das z was du nach der Homogenisierung (Division durch w nach der Projektionsmatrix) hast aber eigentlich schon dein 1/z ist dreht sich das ganze wieder um. Den z-Wert (brauchst du sowieso fürs Depth-Buffering ;) ) kannst du nun einfach linear Interpolieren (da er eigentlich 1/z entspricht). Was die Attribute angeht interpolierst du nun den Attribut*z Wert linear über das Dreieck. An jedem Pixel bestimmst du nun 1/z (für das interpolierte z das du sowieso berechnen musst) und multiplizierst deine interpolierten Attribute damit um den finalen Wert zu bekommen. So brauchst du nur eine einzelne Division pro Pixel.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (18.04.2011, 01:37)


9

18.04.2011, 11:06

Problem ist aber dass ich in Delphi( damit bin ich hier unterwegs) wenn ich Attribute*Z mache(wobei dann z < 1 ist), muss am ende noch ein Trunc() hin und dass ist genauso schädlich wie eine Division. Muss nämlich zugeben dass ich nicht ganz dahinter gekommen bin wie ich die FixedPointMath bei mir umsetzen kann.

Floating points haben doch einen nicht festgelegten kommapunkt und FixedPoint haben einen festplazierten KommaPunkt oder?

Und nochmal Oben auf die Tranformation: Also muss ich jetzt zuerst Z aus dem NICHT ViewTransformierten Polygon errechnen?
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

18.04.2011, 11:11

Problem ist aber dass ich in Delphi( damit bin ich hier unterwegs) wenn ich Attribute*Z mache(wobei dann z < 1 ist), muss am ende noch ein Trunc() hin und dass ist genauso schädlich wie eine Division. Muss nämlich zugeben dass ich nicht ganz dahinter gekommen bin wie ich die FixedPointMath bei mir umsetzen kann.

Floating points haben doch einen nicht festgelegten kommapunkt und FixedPoint haben einen festplazierten KommaPunkt oder?


Ich versteh nicht ganz, warum musst du z Truncaten?

Und nochmal Oben auf die Tranformation: Also muss ich jetzt zuerst Z aus dem NICHT ViewTransformierten Polygon errechnen?

Nein. Das z nach der Projektion kannst du linear interpolieren. Das davor nicht.

Werbeanzeige