PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : welche Daten wo gespeichert


Früchtemüsli
2013-08-15, 21:05:16
Hi :)

Ich würde gerne ganz allgemein erfahren, wo welche Daten abgespeichert werden.

In einem Rendering-Programm muss man einige Schritte abarbeiten (Grafik-Pipeline). Z. B. muss man zuallererst die eigentlichen Geometrie-Daten definieren. Da wird folgendes vorgeschlagen:

Klasse Vertex (bzw. Vector): mit x, y, und z
Klasse Edge: mit 2 Vertices
Klasse Triangle: mit 3 edges

Da würde mich mal interessieren, welche Vorteile es bringt, hier eine Klasse Edge zu definieren. Warum referenziert man in der Klasse Triangle nicht gleich auf die 3 Vertices?

Dann fallen während der Abarbeitung der Pipeline diverse Daten an. Die Korrdinaten-Daten im world-space stecken z. B. im scene-graph. Dann werden diese Daten perspektivisch transformiert.

Wo speichert man dann diese perspektivisch transformierten Daten ab, um danach ein clipping durchführen zu können? Beim clipping können sich vertices ändern und auch neue hinzukommen. Wo werden die geclippten Daten abgespeichert, um danach das fragment-shanding durchführen zu können?

Irgendwelche Daten zu überschreiben, ist ja nicht erlaubt. Denn im nächsten Frame einer Animation müssen die ursprünglichen Daten schließlich wieder zur Verfügung stehen.

Ich hoffe, ich habe das so einigermaßen verständlich erklärt. Es geht also darum, wo welche errechneten Daten abgelegt werden.

:)

xxMuahdibxx
2013-08-16, 04:59:46
kennst du RAM ...

Ich glaub zu wissen das man dort wenn Strom auf dem PC ist sogar Daten abspeichern kann.
Ob das nun Mainboard RAM oder Grafikkarten RAM ist kommt einfach drauf an wo was berechnet wird .

Also sorry aber selbst ohne Programierkenntnisse sollte man sich die Frage beantworten können .

Zur Not kann man auch Daten vom RAM auf die Festplatte auslagern . Fällt mir noch so ein das das Windows sogar selber drauf hat nennt sich Auslagerungsdatei .

Und Daten überschreiben ist nicht erlaubt ... was soll das denn sein ?
Sicher man merkt sich Daten aber nur solange wie man sie braucht und dann darf man auch überschreiben .

Oder willst du genau wissen wo das wo ist wie z.b.

C:\hier

oder Ram Riegel 1 Zelle 2030 Spalte 7456 ?

Früchtemüsli
2013-08-16, 09:38:34
Eigentlich meinte ich, welche Daten in welchen Objekten in welcher Form abgespeichert werden. Die Hardware interessiert mich nicht, nur die Programmierung.

eXistence
2013-08-16, 11:39:16
Was du beschreibst ist eher eine logische Definition von Geometrie, physisch sieht das in der Regel etwas anders.

Bezogen auf Rendering wird Geometrie in der Regel über zwei verschiedene Buffer realisiert: Vertex Buffer und Index Buffer.

Der Vertex Buffer ist quasi ein Array das alle Vertices enthält.
Der Index Buffer ist quasi ein Array mit Indices in den Vertex Buffer.

Drei aufeinander folgende Indices bilden jeweils ein Dreieck
(alternativ kann man so auch je zwei aufeinander folgende Indices als Linie auffassen, oder einzelne Indices als Punkte).

Das ist nur das grobe Prinzip, dank der recht frei programmierbaren Grafik-Pipeline gibts da natürlich reichlich Unterschiede zwischen den einzelnen Programmen und Anwendungsfällen.

CAD-Software und entsprechende Dateiformate müssen die Daten zum einfachen Bearbeiten häufig auch noch anders strukturiert vorhalten (ähnlich wie du es beschreibst), aber das hat mit der Grafik-Pipeline nur indirekt etwas zu tun.

Früchtemüsli
2013-08-20, 13:04:56
Nehmen wir mal einen Phong-Shader.

Zu den Eckpunkten eines Dreieck benötigt man deren Koordinatenangaben im screen-space. Wo landen diese screen-space-Angaben? In der gleichen Klasse, wo ich auch die Koordinatenangaben im local-space habe?

Ich könnte eine Triangle-Klasse haben. Dort habe ich 3 Indizes. Diese Indizes verweisen auf die Vertices (Eckpunkte des Dreiecks). Stecke ich dann die local-space-Koordinatenangabe auch in die Triangle-Klasse?

class Triangle
{
public localSpaceVertex0Index;
public localSpaceVertex1Index;
public localSpaceVertex2Index;

public screenSpaceVertex0Vector; // x, y, z, h
public screenSpaceVertex1Vector; // x, y, z, h
public screenSpaceVertex2Vector; // x, y, z, h
}

Oder sollen sie screen-space-Vektoren überhaupt nichts mit der Triangle-Klasse zu tun haben?

Früchtemüsli
2013-08-20, 13:11:38
Oder ein anderes Beispiel, aber trotzdem wieder in Zusammenhang mit shadern.

Bei diversen Shadern möchte ich aus den Dreiecks-Normalen Vertex-Normale berechnen. Ein Dreieck hat 3 Vertices, also habe ich dann auch 3 Vertex-Normalen.

Die Vertices sind vielleicht allesamt in einem Array gespeichert. Die Triangle-Klassen referenzieren dann immer auf 3 Einträge in diesem Array.

Sollte ich jetzt zu jedem Vertex auch gleich eine Normale vorsehen?

class Vector
{
public x;
public y;
public z;
public h;
// im Konstruktor die Parameter den Eigenschaften zuordnen ...
}

class Vertex extends Vector
{
public normal = new Vector(0, 0, 0, 1); // der Normalen-Vektor zum Vertex (hier initialisiert)
}

array vertices;
vertices[0] = new Vertex(1, 2, 3)
vertices[1] = new Vertex(4, 5, 6)

Oder sollten die Normale-Vektoren ganz woanders abgelegt werden?

Früchtemüsli
2013-08-20, 13:17:06
Oder nehmen wir als nächstes Beispiel das clipping.

Wenn ich clippe, können aus 1 Dreieck 2 Dreiecke entstehen. Vertices landen nach dem clipping entweder ganz woanders oder womöglich kommen auch ganz neue Vertices hinzu.

Soll ich also beim clippen eine komplett neue Vertex-Liste aufstellen?

class Clipping
{
public originalVertices; // die usprüngliche Liste aller vertices
public clippedVertices; // die Liste, die hier komplett neu angelegt wird
}

Mit den clippedVertices wird dann im shader gearbeitet.
Macht man das so?

Kant
2013-08-21, 18:17:36
@Früchtemüsli

Ich bin mir nicht ganz sicher worauf du abzielst.
Die meisten angesprochenen Dinge würde nur in einem Software renderer Sinn machen. Und selbst da würde man nicht vertexe beim clippen in den screenspace erzeugen. Das würde man dann vermutlich eher in einzelnen Zeilen unterteilen.

Also, was hast du eigentlich vor?

Früchtemüsli
2013-08-22, 11:30:26
Also, was hast du eigentlich vor?
Zu Übungszwecken einen Software-Renderer programmieren :)

Gast
2013-08-22, 15:43:27
Die meisten angesprochenen Dinge würde nur in einem Software renderer Sinn machen. Es sei denn, er versucht sich in Shader-Programmierung mit Cg, GLSL o.ä.

Einen Phong-Shader als Shader-Programm in GLSL habe ich auch schon einmal programmiert. Weiß aber leider nicht mehr genau, wie ich das gemacht habe, ist schon einige Jahre her.