2014-12-14 15 views
5

Ho shader memorizzato in un valore String:Come passare String come parametro GLchar ** (char **) in glShaderSource?

var myShader = 
    " attribute vec4 a_position;" + 
    " void main() {" + 
    " gl_Position = a_position;" + 
    " }" 

    glShaderSource(shader, GLsizei(1), myShader, nil) 

La glShaderSource funzione ha la firma bind:

func glShaderSource(shader: GLuint, count: GLsizei, string: UnsafePointer<UnsafePointer<GLchar>>, length: UnsafePointer<GLint>) 

Quando provo a passare la stringa shader per glShaderSource direttamente ottengo il messaggio di errore :

'String' is not convertible to 'UnsafePointer<UnsafePointer<GLchar>>' 

Come passare String in modo corretto? (xCode versione 6.1 (6A1052d))

+0

' glShaderSource' prende una serie di stringhe. –

+0

@ColonelThirtyTwo Sì, certo. Ma una singola stringa può essere passata come 'char text [] =" ... "; glShaderSource (s, 1, (char **) text, NULL) 'in C. Quindi penso che il singolo strnig possa essere passato in Swift nello stesso modo. In ogni caso sarò altrettanto felice di sapere come passare una stringa singola o una stringa per funzionare. –

+2

Non è corretto. È 'glShaderSource (s, 1, & text, NULL)' in C. –

risposta

5

Dopo la ricerca di mezza giornata ho trovato la soluzione lavoro senza erros di compilazione e di accesso alla memoria cattivo esito negativo:

var cStringSource = (code as NSString).UTF8String 
glShaderSource(shader, GLsizei(1), &cStringSource, nil) 
+0

Questo non viene compilato per me. Oltre a ciò che sarebbe 'codice' in questo caso? Inoltre, dove altro stai usando' stringafromutfstring' ? – Unheilig

+0

@Unheilig Io uso il codice in questo metodo https://gist.github.com/kreshikhin/b9c950b9ca982b7303f7 Questo codice che uso in produzione, quindi non ho avuto problemi nella compilazione. E sì, hai ragione, stringfromutf8string è inutile –

+0

Grazie per l'essenza (+1). Sto ancora avendo problemi con l'alimentazione dell'ultimo parametro. Se ti capita di conoscere la sintassi corretta, per favore condividi. Grazie ancora. – Unheilig

2

CLchar è tipografico come un CChar nell'implementazione di OpenGLs Swift. Fare la conversione in questo modo:

var shaderString: String = "here's a String" 
let cstring = shaderString.cStringUsingEncoding(NSUTF8StringEncoding) 
glShaderSource(shader, GLsizei(1), UnsafePointer(cstring), nil) 
+0

Ho ricevuto il messaggio "Valore del tipo facoltativo" [CChar]? "Non scartato, intendevi usare"! "O"? "?" –

+0

Questo ha funzionato per me, ma ho dovuto usare "!" dopo 'cStringUsingEncoding()' per scartare il risultato – kelin

2

Swift 3:

let shaderStringUTF8 = shaderString.cString(using: String.defaultCStringEncoding) 
var shaderStringUTF8Pointer = UnsafePointer<GLchar>(shaderStringUTF8) 

glShaderSource(shaderHandle, GLsizei(1), &shaderStringUTF8Pointer, nil) 
+0

errore di digitazione nella seconda riga. –

+1

seconda riga deve essere modificata in var shaderStringUTF8Pointer = UnsafePointer (shaderStringUTF8) –

Problemi correlati