2014-12-14 7 views
5

Ich habe Shader, die in einem String-Wert gespeichert:Wie übergeben String als GLchar ** (char **) Parameter in glShaderSource?

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

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

Die Funktion glShaderSource die Binde Signatur hat:

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

Wenn ich versuche, den Shader String passieren direkt erhalte ich die Fehlermeldung glShaderSource :

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

Wie String richtig übergeben? (xCode Version 6.1 (6A1052d))

+0

' glShaderSource' nimmt ein Array von Strings. –

+0

@ColonelThirtyTwo Ja, natürlich. Eine einzelne Zeichenfolge kann jedoch als 'char text [] =" ... "übergeben werden; glShaderSource (s, 1, (char **) Text, NULL) 'in C. Ich denke also, dass Single Strnig in Swift auf die gleiche Weise übergeben werden kann. In jedem Fall werde ich ebenso glücklich sein zu lernen, wie man ein einzelnes String- oder String-Array an die Funktion übergeben kann. –

+2

Das ist nicht korrekt. Es ist 'glShaderSource (s, 1, & Text, NULL)' in C. –

Antwort

5

Nach einem halben Tag Suche fand ich die Arbeit Lösung ohne Kompilierung erros und schlechte Speicherzugriff fehlschlägt:

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

Dies kompiliert nicht für mich. Abgesehen davon, was wäre 'code' in diesem Fall? Außerdem, wo sonst verwendest du' stringfromutfstring' ? – Unheilig

+0

@Unheilig Ich benutze den Code in dieser Methode https://gist.github.com/kreshikhin/b9c950b9ca982b7303f7 Dieser Code verwende ich in der Produktion, so hatte ich keine Probleme bei der Kompilierung. Und ja, Sie haben Recht, stringfromutf8string ist unnötig –

+0

Danke für das Wesentliche (+1). Ich habe immer noch Probleme mit dem letzten Parameter. Wenn Sie die korrekte Syntax kennen, teilen Sie sie bitte mit. Danke noch einmal. – Unheilig

2

CLchar ist typisiert als eine CChar in OpenGLs Swift-Implementierung. Sprechen Sie die Konvertierung wie folgt aus:

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

Ich habe die Nachricht "Wert des optionalen Typs '[CChar]?' Nicht ausgepackt; wollten Sie '!' Oder '?'?". –

+0

Dies funktionierte für mich, aber ich musste "!" nach 'cStringUsingEncoding()' verwenden, um das Ergebnis auszupacken. – kelin

2

Swift 3:

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

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

Tippfehler in der zweiten Zeile. –

+1

zweite Zeile sollte zu ändern var shaderStringUTF8Pointer = UnsafePointer (shaderStringUTF8) –

Verwandte Themen