2010-05-30 6 views
10

Kreise sind eine der grundlegenden geometrischen Einheiten. Dafür gibt es in OpenGL keine Primitive, wie Linien oder Polygone. Warum? Es ist ein wenig lästig, dafür immer benutzerdefinierte Header zu verwenden!Warum gibt es in OpenGL kein primitives Kreis- oder Ellipsenelement?

Gibt es einen bestimmten Grund, es wegzulassen?

+9

So dass wir Leute bitten können, eine Kreisfunktion in technischen Interviews zu schreiben. –

Antwort

17

Während Kreise Grundformen sein können sie als Punkte, Linien oder Dreiecke nicht so grundlegend sind, wenn es um Rasterung kommt. Die ersten Grafikkarten mit 3D-Beschleunigung wurden entworfen, um eine Sache sehr gut zu machen, Dreiecke (und Linien und Punkte, weil sie trivial hinzuzufügen waren) zu rastern. Das Hinzufügen von komplexeren Formen hätte die Karte sehr viel teurer gemacht und gleichzeitig nur wenig Funktionalität hinzugefügt.

Aber es gibt noch einen anderen Grund, Kreise/Ellipsen nicht einzubeziehen. Sie verbinden sich nicht. Sie können kein 3D-Modell daraus erstellen und Sie können keine Dreiecke mit ihnen verbinden, ohne Lücken oder überlappende Teile hinzuzufügen. Damit Kreise brauchbar sind, benötigen Sie auch andere Formen wie Kurven und andere komplexere Oberflächen (z. B. NURBS). Kreise allein sind nur als "große Punkte" nützlich, die auch mit einer quad- und einer kreisförmigen Textur oder Dreiecken durchgeführt werden können.

Wenn Sie "benutzerdefinierte Header" für Kreise verwenden, sollten Sie beachten, dass diese wahrscheinlich ein Dreiecksmodell erstellen, das Ihre "Kreise" bildet.

+0

Können Sie erklären, was Sie unter "Benutzerdefinierte Header" verstehen? –

+1

Es kommt von der Frage. Ich weiß nicht, was genau Ram damit gemeint hat, aber ich denke, es ist eine Bibliothek mit einigen OpenGL-Funktionen. –

+0

* Pfote * Richtig, ich hätte die Frage zuerst lesen sollen, hmm? Vielen Dank. –

2

In der Vergangenheit haben Videokarten Punkte, Linien und Dreiecke gerendert.

Sie berechnen Kurven mit kurzen Linien, so dass die Grafikkarte nicht muss.

+0

+1 für den unfairen Downvote. Dies ist eine gültige Antwort. –

0

Sie könnten immer gluSphere verwenden (wenn eine dreidimensionale Form ist, was Sie suchen).

Wenn Sie einen zweidimensionalen Kreis zeichnen möchten, bleiben Sie mit benutzerdefinierten Methoden stecken. Ich würde mit einem Dreiecksfan gehen.

Die Primitive sind Primitiven für einen Grund :)

1

diese Worte auf Auflösung

2

Da Grafikkarten arbeiten auf 3-dimensionalen Punkte, Linien und Dreiecke abhängt. Ein Kreis erfordert Kurven oder Splines. Es kann nicht perfekt durch ein "normales" 3D-Primitiv dargestellt werden, nur angenähert als ein N-Gon (so wird es wie ein Kreis in einer bestimmten Entfernung aussehen). Wenn Sie einen Kreis wollen, schreiben Sie die Routine selbst (es ist nicht schwer zu tun). Zeichne es entweder als N-Gon, oder mache ein Quadrat (2 Dreiecke) und schneide einen Kreis daraus mit dem Fragment-Shader (du kannst einen perfekten Kreis auf diese Weise erhalten).

+1

+1. Um pendantisch zu sein, nähern sich Fragment-Shader immer noch nur dem Kreis um die Pixel auf dem Bildschirm an. Kein perfekter Kreis. = P –

+0

@ Xavier Ho: Immer noch, mit einem Fragment Shader erhalten Sie perfekte Annäherung fast in jeder Entfernung von Kreis (in sehr naher Entfernung könnte es eine Genauigkeit Fehler sein). Werfen Sie ein bisschen Antialiasing in die Berechnung, und es gibt nichts, worüber Sie sich beschweren könnten. – SigTerm

+0

"Perfekte Annäherung" - ich nenne Oxymoron! Und ja, du hättest Recht. –

Verwandte Themen