2014-12-19 7 views
6

Ich versuche, eine schwarze einzelne Linie auf GLKitView, mit zu zeichnen, aber es funktioniert nicht. Ich kann Bildschirm löschen und ich kann es mit jeder Farbe füllen, aber ich kann nichts darauf zeichnen. Und ich weiß, diese Frage wurde oft gestellt, aber ich konnte auf Swift keine Antwort finden. Mehr darüber, es gibt keine Informationen über die Verwendung von OpenGL ES mit Swift, also kam ich hierher.Swift - Wie zeichne Linie in OpenGL ES?

Hier ist mein Code:

import GLKit 

class MyGLKit: GLKView { 
    override func drawRect(rect: CGRect) { 
     glClearColor(0.8, 0.8, 0.8, 1.0) 
     glClear(GLbitfield(GL_COLOR_BUFFER_BIT)) 

     glColor4f(0, 0, 0, 1) 

     var line: [GLfloat] = [-1, 0, 1, 0] 
     var len = line.count * sizeof(GLfloat) 

     // Create an handle for a buffer object array 
     var bufferObjectNameArray: GLuint = 0 

     // Have OpenGL generate a buffer name and store it in the buffer object array 
     glGenBuffers(1, &bufferObjectNameArray); 

     // Bind the buffer object array to the GL_ARRAY_BUFFER target buffer 
     glBindBuffer(GLbitfield(GL_ARRAY_BUFFER), bufferObjectNameArray); 

     // Send the line data over to the target buffer in GPU RAM 
     glBufferData(
     GLbitfield(GL_ARRAY_BUFFER), // the target buffer 
     len,       // the number of bytes to put into the buffer 
     line,       // a pointer to the data being copied 
     GLbitfield(GL_STATIC_DRAW)); // the usage pattern of the data 

     glVertexPointer(2, GLbitfield(GL_FLOAT), 0, line); 
     var programHandle: GLuint = glCreateProgram() 
     glLinkProgram(programHandle) 

     glDrawArrays(GLbitfield(GL_LINES), 0, 2); 
    } 
} 

Ich bin nicht sicher, was dieser Code tut, weil OpenGL ES irrsinnig scheint, nach der üblichen OpenGL. Ich meine, Sie müssen viel Code schreiben, nur um eine einzelne Zeile zu zeichnen. Warum funktioniert das so?

+0

Sie benötigen den Aufruf 'glVertexPointer()', den Sie auskommentiert haben. Aber verwenden Sie '0' als letztes Argument, da dies der Offset in den Puffer ist, wenn ein Puffer gebunden ist. –

+1

@RetoKoradi Ich kann '0' nicht als letztes Argument verwenden, weil XCode sagt' Kann nicht 'init' mit einer Argumentliste vom Typ '(IntegerLiteralConvertible, $ T3, IntegerLiteralConvertible, IntegerLiteralConvertible)' aufrufen. Das letzte Argument ist _Spezifiziert einen Zeiger auf die erste Koordinate des ersten Eckpunkts im Array_. Es muss also ein Zeiger auf das erste Element des Arrays sein. Aber wie schafft man es? –

+0

Ich stimme mit OP, OpenGL-ES mit swift ist "verrückt". Ich möchte nur eine verdammte Linie von Punkt A nach Punkt B zeichnen. Warum zur Hölle braucht das mehr als 20 Zeilen gl-Code? Warum ist das nicht ein Primitiv? +1 für 'wahnsinnig ' –

Antwort

1

Ich habe Swift nicht verwendet, sondern basierend auf Code in OpenGL EXC_BAD_ACCESS when calling glDrawElements in Swift but not in Objective-C, Ihr glVertexPointer() Aufruf sollte wie folgt aussehen:

let bufferOffset: CConstVoidPointer = COpaquePointer(UnsafePointer<Int>(0)) 
glVertexPointer(2, GLbitfield(GL_FLOAT), 0, bufferOffset); 

Es sieht auch wie Sie nicht wirklich sind ein Shader-Programm Aufbau:

var programHandle: GLuint = glCreateProgram() 
glLinkProgram(programHandle) 

Es gibt eine Reihe von Dingen, die zwischen hier gehen müssen, wenn Sie einfach OpenGL verwenden. Du musst Shader-Objekte erstellen, ihnen Code geben, der in GLSL geschrieben ist, Aufrufe machen, um die Shader zu kompilieren usw. Ich glaube, dass GLKit die Funktionalität besitzt, vorgebackene Shader zu verwenden.

Warum OpenGL so "verrückt" ist, das würde den Rahmen dieser Seite sprengen. Und sehr subjektiv. IMHO, der wichtigste Punkt zu beachten ist, dass OpenGL nicht als eine praktische API für Programmierer entwickelt wurde. Es wurde entwickelt, um eine relativ dünne generische Abstraktion für den Zugriff auf Grafikhardware bereitzustellen. Und die Tendenz zu vergleichbaren APIs besteht eigentlich darin, die Abstraktionsschicht noch dünner zu machen, um den Overhead zu reduzieren (siehe z.B. DirectX 12).

Es gibt nichts, was jemanden davon abhält, bequemere übergeordnete APIs auf OpenGL zu implementieren. Diese Schnittstellen existieren und die Leute benutzen sie.

+1

Ich habe diese' Verwendung von nicht deklarierten' CConstVoidPointer'-Fehler. Als ich den Typ in 'UnsafePointer' änderte, funktionierte es, aber es wurde immer noch nichts gezeichnet. –

+0

Ich würde Sie einladen, die Antwort zu bearbeiten, aber es besteht die Möglichkeit, dass Ihre Bearbeitung abgelehnt wird, da sie die Bearbeitungsüberprüfungswarteschlange durchlaufen muss. Darüber hinaus sieht es so aus, als ob Sie kein Shader-Programm erstellen können. Ich habe einen Absatz dazu hinzugefügt. Tut mir leid, wenn meine Antwort nicht sehr hilfreich ist. Ich bin mir nicht sicher, ob ich es löschen sollte. Normalerweise beantworte ich keine Fragen zu Themen, die ich nicht verstehe, einschließlich Swift. –

+1

Ich denke, dass du Recht hast. Es ist so schwer, es zum Laufen zu bringen! Es macht auch keinen Sinn, weil ich keine 3D-Grafiken brauche. Alles was ich will - zeichne primitive Linien und Kreise. Wahrscheinlich können Sie einige dieser "_more comfortable höheren APIs auf OpenGL_" nennen? –

Verwandte Themen