Frage

Ich bin nur mit OpenGL ES 2.0 begonnen, was ich möchte tun, einige einfache 2D-Ausgabe erstellen. Bei einer Auflösung von 480x800, wie kann ich eine Hintergrundtextur ziehen?

[Meine Entwicklungsumgebung Java / Android, so Beispiele direkt zu beziehen, das wäre am besten, aber auch andere Sprachen wäre in Ordnung.]

War es hilfreich?

Lösung

Auch wenn Sie auf Android sind, habe ich ein iPhone Beispielanwendung, die für Rahmen von Video-tut dies kommt in. Sie den Code für diese Probe von here . Ich habe eine Zuschreibung über diese Anwendung, die farbbasierte Objektverfolgung unter Verwendung von Live-Video der Fall ist, dass Sie hier .

In dieser Anmeldung I zwei Dreiecken zeichnen ein Rechteck zu erzeugen, dann Textur, die die folgenden Koordinaten:

   static const GLfloat squareVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    static const GLfloat textureVertices[] = {
        1.0f, 1.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        0.0f,  0.0f,
    };

Zum Video-Frame als Textur passieren, verwende ich ein einfaches Programm, mit den folgenden Vertex-Shader:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main()
{
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
}

und die folgenden Fragment-Shader:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, textureCoordinate);
}

Zeichnung ist eine einfache Sache, das richtige Programm:

glUseProgram(directDisplayProgram);

die Textur einheitliche Einstellung:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, videoFrameTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

Setzen der Attribute:

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

und dann die Dreiecke zeichnen:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Andere Tipps

Sie zeichnen nicht wirklich einen Hintergrund, Sie stattdessen ein Rechteck zeichnen (oder, noch richtiger: zwei Dreiecken ein Rechteck bilden) und stellen eine Textur, dass. Das ist nicht anders überhaupt von einem anderen Objekt auf dem Bildschirm zeichnen.

Es gibt viele Orte, die zeigen, wie dies geschehen ist, vielleicht gibt es sogar ein Androide Beispielprojekt dies zeigt.

Der schwierige Teil ist, etwas anderes zu Anzeige vor oder hinter etwas zu bekommen. Damit dies funktioniert, müssen Sie einen Tiefenpuffer einzurichten und ermöglichen eine gründlichere Prüfung (glEnable (GL_DEPTH_TEST)). Und Ihre Eckpunkte müssen eine Z haben Koordinate (und sagen glDrawElements, dass Ihre Eckpunkte setzen sich aus drei Werten, nicht zwei).

Wenn Sie das nicht tun, werden die Objekte in der Reihenfolge ihrer glDrawElements () Funktionen wiedergegeben werden genannt (das heißt je nachdem, was Sie zuletzt ziehen den Rest Verschleiern am Ende).

Mein Rat ist kein Hintergrundbild haben oder etwas Besonderes zu tun, bis Sie den Dreh raus zu bekommen. OpenGL ES 2.0 hat ein bisschen eine steile Lernkurve und Tutorials auf ES 1.x nicht wirklich Hilfe mit 3D bekommen zu arbeiten, weil sie Hilfsfunktionen wie gluPerspective verwenden können, die 2,0 nur noch nicht. Beginnen Sie mit einem Dreieck auf einem Hintergrund von nichts zu schaffen. Als nächstes macht es zu einem Quadrat. Dann, wenn Sie schon Lust gehen wollen, fügen Sie eine Textur. Spielen Sie mit Positionen. Sehen Sie, was passiert, wenn man den Z-Wert Ihrer Eckpunkten ändern. (Hinweis: Nicht viel, wenn Sie nicht über eine gründlichere Prüfung aktiviert Und selbst dann, wenn Sie nicht perspektivische Projektion haben, werden Objekte erhalten nicht kleiner, je weiter sie weg sind, so ist es immer noch, als ob nichts erscheinen wird. geschah)

Nach ein paar Tagen, hält es so verdammt frustrierend sein, und man endlich "get it", meistens.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top