2014-12-19 17 views
6

Sto provando a disegnare una linea singola nera su GLKitView, utilizzando Swift, ma non funziona. Posso cancellare lo schermo e posso riempirlo con qualsiasi colore, ma non posso disegnare nulla su di esso. E so che questa domanda è stata posta molte volte, ma non ho trovato alcuna risposta su Swift. Inoltre, non ci sono informazioni sull'utilizzo di OpenGL ES con Swift, quindi sono venuto qui.Swift - Come disegnare una linea in OpenGL ES?

Ecco il mio codice:

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); 
    } 
} 

Non sono sicuro di ciò che questo codice facendo, causa OpenGL ES sembra follemente, dopo consueta OpenGL. Voglio dire, devi scrivere molto codice solo per disegnare una singola riga. Perché funziona in questo modo?

+0

Avrete bisogno della chiamata 'glVertexPointer()' a cui avete commentato. Ma usa '0' come ultimo argomento, poiché questo è l'offset nel buffer se è associato un buffer. –

+1

@RetoKoradi Non posso usare '0' come ultimo argomento, perché XCode dice' Impossibile richiamare 'init' con un elenco di argomenti di tipo '(IntegerLiteralConvertible, $ T3, IntegerLiteralConvertible, IntegerLiteralConvertible)' '. L'ultimo argomento è _Specifica un puntatore alla prima coordinata del primo vertice dell'array_. Quindi deve essere un puntatore al primo elemento dell'array. Ma come farlo? –

+0

Sono d'accordo con OP, OpenGL-ES con swift è 'insano'. Voglio solo disegnare una maledetta linea dal punto A al punto B. Perché diavolo serve più di 20 linee di codice gl? Perché non è così primitivo? +1 per 'insane' –

risposta

1

Non ho usato Swift, ma sulla base di codice nella OpenGL EXC_BAD_ACCESS when calling glDrawElements in Swift but not in Objective-C, la chiamata glVertexPointer() dovrebbe assomigliare a questa:

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

Sembra inoltre che non sei veramente costruzione di un programma di shader:

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

C'è un sacco di cose che devono passare tra qui se stai usando OpenGL. Devi creare oggetti shader, dare loro il codice scritto in GLSL, effettuare chiamate per compilare gli shader, ecc. Credo che GLKit abbia funzionalità per usare shader precotti.

Per quanto riguarda il motivo per cui OpenGL è così "folle", questo va oltre lo scopo di questo sito. E molto soggettivo. IMHO, il punto principale da tenere a mente è che OpenGL non è progettato per essere una comoda API per i programmatori. È progettato per fornire un'astrazione generica relativamente sottile per l'accesso all'hardware grafico. E la tendenza per API comparabili è in realtà di rendere il livello di astrazione ancora più sottile per ridurre il sovraccarico (vedi ad esempio DirectX 12).

Non c'è niente che impedisca a nessuno di implementare API di livello superiore più convenienti su OpenGL. Queste interfacce esistono e le persone li usano.

+1

Ho questo errore' Uso di tipo non registrato 'CConstVoidPointer''. Quando ho cambiato il tipo in 'UnsafePointer' ha funzionato, ma ancora non viene disegnato nulla. –

+0

Ti invito a modificare la risposta, ma è probabile che la tua modifica venga rifiutata poiché dovrà passare attraverso la coda di revisione delle modifiche. Oltre a ciò, sembra che manchi di creare un programma shader. Ho aggiunto un paragrafo a riguardo. Scusa se la mia risposta non è molto utile. Non sono sicuro se dovrei eliminarlo. Normalmente non rispondo a domande su argomenti che non capisco, incluso Swift. –

+1

Penso che tu abbia ragione. È così difficile farlo funzionare! Inoltre, non ha senso, perché non ho bisogno di grafica 3D. Tutto ciò che voglio - Disegna linee e cerchi di linee primitive. Probabilmente, potresti citare alcune delle "più convenienti API di livello superiore su OpenGL_"? –