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

04.03.2011, 23:37

[Hilfe]DepthBuffer Konzept? Polygon Konzept? SoftwareRenderPerformance Konzepte?

Nabend,
Ich dachte ich schreibe endlich mal nen minimalistischen Softwarerenderer in Delphi. Möchte einfach mal wissen wie es so hinter der Haube funktioniert.

(nutze Delphi)
Rasterizer, DepthMap Rendern /Testen, Klappt alles.Aber ich habe mal ne konzeptionelle frage:

Wird ein Polygon(sofern es gezeichnet werden darf) in einem rutsch in die DepthMap und den Backbuffer geschrieben(was ich jetzt dachte) oder wird erst die Depthmap erstellt, und dann alle Polies auf den BackBuffer?(Letzteres macht in meinen augen weniger sinn).

Und, was eignet sich am besten um Polygone intern zu speichern?
ich hab nen Record(T3DPoint) mit den Integern X/Y/Z, sowie ein TTriangle was ein array[0..2] von T3DPoint ist.
Solange ich einzelne Polies hab, alles kein Problem. Unübersichtlich, wird es nur, wnen ich z.B einen würfel machen möchte(also "komplexere" Strukturen).

EIn Würfel hat 8 Ecken(8 ecken hat mein..ach ne falsch^^) und 6 Seiten. Für die 3D Darstellung hat er aber 12 Polies mit je 3 Punkten. Jede Ecke des Würfels ist also mit mehreren Punkten verschiedener Polies verbunden, wen man es so sehen möchte.

Und hier brauch ich ein Konzept: Ein Vertex kann im Normalfall mit mehreren Polies verbunden sein(und verbindet so diese). Wie bekomme ich soetwas möglichst sauber hin?(Strukturel). Immoment ist Jedes Poly für sich, und wnen ich eine Ecke des würfels Ändern möchte(rotation z.B) und ich dan den neuen wert eintragen muss, wirds bei mir hässlich.

Jemand ne Idee?


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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Memnarch« (09.03.2011, 16:27) aus folgendem Grund: Letzteres sollte eigentlich nen neuer thread werden, ausversehen hier angehängt, deswegen überschrift ergänzt.


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.03.2011, 23:45

Wird ein Polygon(sofern es gezeichnet werden darf) in einem rutsch in die DepthMap und den Backbuffer geschrieben(was ich jetzt dachte) oder wird erst die Depthmap erstellt, und dann alle Polies auf den BackBuffer?(Letzteres macht in meinen augen weniger sinn).

Ersteres

Und hier brauch ich ein Konzept: Ein Vertex kann im Normalfall mit mehreren Polies verbunden sein(und verbindet so diese). Wie bekomme ich soetwas möglichst sauber hin?(Strukturel). Immoment ist Jedes Poly für sich, und wnen ich eine Ecke des würfels Ändern möchte(rotation z.B) und ich dan den neuen wert eintragen muss, wirds bei mir hässlich.

Jemand ne Idee?

Dafür verwendet man Indices. Jedes Dreieck speichert die 3 Indices seiner Vertices im Vertex Array.

3

04.03.2011, 23:47

Achsoo, also hat ein Dreieck keine Punkte, sondern nur die referenzen dazu?
Dann ist ja auch klar warums bei mir so wustig ist XD. Mal abgesehen davon bekomme ich die klasse so um einiges strukturierter hin :)


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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

04.03.2011, 23:50

Naja, ausgewachsene Grafik APIs wie z.B. Direct3D oder OpenGL unterstützen beide Möglichkeiten (Indices oder nicht), aber für zusammenhängende Meshes sind Indices das Mittel der Wahl.

5

09.03.2011, 16:23

Konzept für Softwarerenderperformance

Tag allerseits.
Da mein Softwarerasterizer ganz gut funktioniert, muss ich gucken, was ich noch verbessernkann.

Ich hatte z.B. diesen Softwarerasterizer gefunden:

http://www.devmaster.net/forums/showthread.php?t=1884

Der arbeitet auch flotter als meiner, aber hat halt eben nicht die möglichkeit eine Depthmap zu nutzen.(wie wird denn dann VERNÜNFTIGes zsorting gemacht?)
In meinem Rasterizer kalkuliere ich ob ein Punkt in einem dreieck liegt, indem ich die flächen der dreiecke
(P ist unser punkt)
PAB, PBC, PCA zusammenrechne und gucke ob die fläche mit der gesamtfläche von ABC übereinstimmt.

Ist dem so, kann ich die flächen auch gleich zum Kalkulieren der Baryzentrischen koordinaten benutzen.(welche ich für die erstellung der depthmap nutze indem ich mit deren hilfe die Zwerte interpoliere)

Leider arbeite ich im gegensatz zum obigen rasterize, auf Pixelbasis. Nicht so schön wie man sich vorstellen kann.

Zum berechnen der fläche nutze ich(als ausgangsformel):

Area= abs(x1*y2+x2*y3+x3*y1-x1*y3-x3*y2-x2*y1)/2

wobei ich "/2" verwerfe(wird nicht gebraucht, weil ich nur die größe der flächen im verhältnis, nicht aber die flächen selbst brauche)
und die formel so aufsplitte, dass nicht alle teile der formel andauernd neu berechnet werden. Die Multiplikationen die z.B P nicht enthalten, werden einmal vor begin der rasterisierung des Polygons berechnet, weil sie konstant bleiben.

Hinzu kommen noch Backfaceculling und eine abfrage, die besagt, wenn der niedrigste Z-wert der drei vertices des Polygons nicht an die aktuelle stelle der depthmap eingetragen werden kann, überspringe die kalkulation ganz(weil wir ja nichts machen wollen/können).


Hat jemand tips/ideen?

EDIT: oha..also eigentlich woltle ich das als neues thema aufmachen >.<. Komtm davon wenn man in gedanken versunken ist v.v

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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.03.2011, 16:29

Nunja, die Methode mit den Halbenentests im von dir verlinkten Artikel ist mehr oder weniger was man heutzutage macht, hat den Vorteil dass es gut parallelisierbar ist. Früher hat man in Software z.B. Scanline-Rasterisierung betrieben. Ich weiß nicht was für Tips/Ideen du genau haben willst. Befolgt dein Rasterizer eine Fillconvention? Wenn nein kannst du dich mal darum kümmern da das ziemlich wichtig ist. Was genau meinst du wenn du sagst dass du "nur Pixelbasiert arbeitest"? Wie schauts mit Texturen aus? Oder Beleuchtung? Oder überhaupt vielleicht ein Shadersystem? Hierarchischer Depthbuffer anyone?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (09.03.2011, 16:36)


7

09.03.2011, 16:42

Fillconvention? keine ahnung ob ich sowas habe, muss ich mal nachschlagen.
Ich arbeite so:

Von meinem gewünschten dreieck werden die min/max x/y koordinaten genommen. In dem daraus reultierenden rechteck, gehe ich jeden pixel durch, (von oben links nach unten rechts) und wenn er im dreieck ist, wird der depthtest ausgeführt und so weiter.

Im moment hab ich noch kein gouradshading, hab imo nur ne depthview^^. Wollte mich dem bereits existierenden widmen, bevor ich weitermache.
Hierarischer depthbuffer? ....*googlen geht*

EDIT: und pixelbasierend bedeutet: ich gehe jeden der in frage kommenden pixel durch und bearbeite sie einzeln. Obiger rasterizer nutz ja chunks fürs grobe.

EDIT2: Gerade gemerkt dass es (für 2 faces die den bildschirm komplett zu decken, 512*512) 15MS braucht um das bild zu zeichnen. Das is :thumbdown:
Muss ichw as dran ändern.

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

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Memnarch« (09.03.2011, 17:32)


Werbeanzeige