Opengl es

Syrato

Admiral
Registriert
Juni 2012
Beiträge
7.305
Kann man mit OPENGL ES, halfedgedatastructure programmieren?

MfG Syrato
 
Ich verstehe die Frage nicht. Sie klingt für mich wie "Kann man in ein Auto mit Verdeck ein Radio einbauen?"
 
Zuletzt bearbeitet:
Wenn man schon mit Begriffen wie OpenGL ES und Half-Edge Data Structure um sich wirft, erwarte ich ja eigentlich, dass
a) die Frage auch so gestellt wird, dass man sie lesen kann
b) aus der Frage klar wird, was eigentlich gemacht werden soll.

Falls du fragst, ob du ohne weitere Aufbereitung irgendeine Datenstruktur an GLES übergeben kannst und die Implementierung dann von selbst errät, wie sie die Daten zu interpretieren hat: Nein, das wird nichts.
 
Sollte recht einfach gehen, sofern man die Datenstruktur nur als Linien gezeichnet haben möchte:
Edges in der Form in ein Array schreiben:
<Edge0Knotenindex0> <Edge0Knotenindex1> <Edge1Knotenindex0> <Edge1Knotenindex1>
Dann auf die GPU in einen Buffer kopieren und als Indexbuffer binden.
Als Nächstes die Knoten in ein Array schreiben:
<Knoten0X> <Knoten0Y> <Knoten0Z> <Knoten1X> <Knoten1Y> <Knoten1Z>
Dann ebenfalls auf die GPU in einen Buffer kopieren und als Buffer für Vertexdaten binden. Dann noch die Pipeline konfigurieren, nen passenden Shader binden, Uniforms setzen und einen Draw-Call per Indexes starten - und fertig.
 
@nai ich möchte ein objekt(zum beispiel ein würfel) in eine datenstruktur unterbringen. dort sollen die vertices, edges und faces gespeichert werden damit ich diese gespeicherten werte in einem algorithmus(Loop-Subdivision) unterbringen kann. dannach will ich die im loop-algorithmus neuen erzeugten vertices/edges/faces am Handy ausgeben.

und dass ich diese frage so komisch gestellt habe, tut mir leid, ist für einen Kollegen.

MfG Syrato
 
Faces wird deutlich schwieriger weil du die vor dem Zeichnen mit OpenGL noch irgendwie triangulieren musst. Auch nehme ich stark an, dass es euch ein paar Tage kosten wird die OpenGL Grundlagen zu verstehen.

Edit: Streiche das mit den Faces, eben gesehen dass der Algorithmus auf Dreiecksnetzen arbeitet.
 
Zuletzt bearbeitet:
hey Nai,

ich bin der Kollege von dem Syrato gesprochen hat.

Die Grundlagen hab ich soweit drauf ( ja es hat mehrere Tage gedauert :) ).
Die Sache ist die, dass ich meine Objekte mit Dreiecken Zeichne. Daher gib ich dem Renderer nur Punkte vor, welche verbunden werden umd diese Dreicke zu zeichnen.
Was mir jetzt gerade fehlt ist, ob ich die Kanten(Verbindungslinien) ohne weiteres auslesen kann.
Da OpenGL ES2.0 ein wenig abgespeckter ist als OpenGL, kenne ich dort keinen Befehl der mir die Verbindungen einzeln ausliest und dann in ein Objekt-Array schreibt.

Leider ist im Netz auch unglaublich wenig zu dem Thema OpenGL ES, bis auf komplexere Spiele und Beginner Tutorials zu finden( oder ich suche falsch -,-).

Danke für die Antwort das ich weiss das es doch eine einfach implementierung ist, jedoch bleibt das oberer Problem mir noch bestehen. Vielt. wweiss du es ja :).

Grüße Turr1can21
 
Tut mir leid, ich kann immer noch nicht hunderprozentig folgen, wo genau euer Problem ist. Wie liegen die Daten denn vor bzw wie zeichnet ihr die Dreiecke bereits? Wie genau liegen die Kanten vor, die ihr zeichnen wollt?

Wenn ihr die Kanten zu den bereits zeichenbaren Dreiecken zeichnen wollt, wäre https://www.opengl.org/sdk/docs/man/html/glPolygonMode.xhtml eine Lösung, falls es (per Extension) verfügbar ist.
 
Um auch nochmal sicher zu stellen das wir nicht komplett vorbei reden.
Ich kann nicht alle Funktionen von OpenGL benutzen, da OpenGL ES für mobile Geräte(Android,iOS) erstellt wurde.

Das eigentlich Problem ist ob ich alle Werte von meinem Würfel (als Beispiel) bekomme, um diese in eine Datenstruktur (in dem Fall half-egde) zu speichern.

Also ich benutze das normale GL_Triangles zum zeichnen.
Daher zeichne ich ja keine Kanten, ausser OpenGL ES zeichnet diese direkt mit (muss ich noch in Erfahrung bringen).
Das heißt im Endeffekt liegen mir nur die EckPunkte und die Flächen der Dreiecke vor.
Wie die Punkte/Fragmente gezeichnet werden, setze ich in einem Vertex/Fragment-Shader fest.
In der Draw Methode benutze ich dann mein GL_Triangles um ein Dreieck mit 3 Punkten zu zeichnen.

So ähnlich steht es hier : http://www.learnopengles.com/android-lesson-one-getting-started/
Nur ist das ein 2D und kein 3D Objekt. (Logik ist aber die selbe)

Ob glPolygonMode in OpenGL ES benutzbar sind muss ich dann auch erst schauen.
Dann jedoch erst morgen.

Ich kann auch gerne TeamViewer/Skype benutzen, um zu zeigen was ich für ein Problem habe, wenn man es nicht in geschriebener Form versteht :). (Vilt. bin ich auch nur schlecht in sowas :( )
Oder ich stell mir das nur komplizierter vor als es eigentlich ist.

Grüße
Turr1can21
 
Code würde eher helfen, wie und was ihr genau zeichnet bzw zeichnen wollt oder wie ihr die Datenstruktur angelegt habt.

Also so wie ich das bislang verstanden habe verwendet ihr glDrawArrays mit GL_Triangles um alle Dreiecke auf einmal zu zeichnen? Und ihr wollt jetzt eben diese Dreiecke nur als Kanten zeichnen?

Wenn dem so ist könntet ihr einfach einen Indexbuffer mit den Indexen
0,1, 1,2, 2,0,
3,4, 4,5, 5,3,
6,7, 7,8, 8,6
...........
erstellen und das mit glDrawElements(GL_Lines .....) zeichnen, das sollte auf alle Fälle gehen.
 
ehmm klar wwenn ich es hardcoden würde wäre es ja nicht das problem. aber wenn ich das später dynamisch machen will, also mit blender ein objekt erzeugen und dann dieses einlesen gibt es paar probleme aber soweit bin ich noch nicht.

ich danke dir vielmals für die Hilfe. Sollte ich nochmal eine Frage haben kann ich Sie ja hier schreiben :)

Grüße Turr1can21
 
Aber das Verfahren ist immer dasselbe, egal ob nun mit dynamischen oder statischen Einträgen.
- Du hast ein Dreieck aus drei bekannten Punkten a, b und c. Um das ganz normal als Dreieck zu rendern, schreibst du die Indizes von a, b und c in den Index-Buffer.
- Um nun die Kanten darzustellen, malst du effektiv eine Linie von a nach b, von b nach c und von c nach a. Also schreibst du a, b, b, c, c, a in den Index Buffer (oder nutzt GL_LINE_LOOP in Verbindung mit einem Primitive Restart Index).
 
Oder um die dynamische Erstellung des Indexbuffers noch einmal in einen CPP-Algorithmus zu fassen:
Code:
int* IndexBuffer = new int[3*2*TriangleCount];
for(int i =0; i < TriangleCount; i++)
{
    IndexBuffer [6*i+0] = 3*i+0;
    IndexBuffer [6*i+1] = 3*i+1;

    IndexBuffer [6*i+2] = 3*i+1;
    IndexBuffer [6*i+3] = 3*i+2;

    IndexBuffer [6*i+4] = 3*i+2;
    IndexBuffer [6*i+5] = 3*i+0;
}

@ VikingGE
Der Primitive Restart Index ist afaik in OpenGL ES nicht verfügbar
 
Zuletzt bearbeitet:
Zurück
Oben