2012-05-09 19 views

回答

3

據我所知,你設置和使用着色器程序,你會在非GLKit OpenGL ES 2.0的應用程序。我目前更喜歡使用他提供的Jeff LaMarche的GLProgram包裝類作爲this tutorial(該代碼應該鏈接在該頁面頂部)的一部分,而不是每次重寫所有用於編譯和鏈接着色器的樣板代碼。

我在this answer中顯示了一些標準的使用。你仍然需要設置你的屬性和制服,但一旦你這樣做,你只需使用該程序並在你的GLKView中繪製幾何圖形。

GLKit基本效果似乎以類似方式作爲一些標準着色器程序的包裝提供。

1

不是我的代碼,但我發現這非常有幫助。它甚至會打印着色器的錯誤。

func compileShader(shaderName: String?, shaderType: GLenum) -> GLuint { 

    let shaderPath = NSBundle.mainBundle().pathForResource(shaderName!, ofType: "glsl") 
    var error: NSError? = nil 
    var shaderString: NSString? 
    do { 
     shaderString = try NSString(contentsOfFile: shaderPath!, encoding: NSUTF8StringEncoding) 
    } catch let error1 as NSError { 
     error = error1 
     shaderString = nil 
    } 
    var shaderS = shaderString! as String 
    shaderS += "\n" 
    shaderString = shaderS as NSString 

    if shaderString == nil { 
     print("Failed to set contents shader of shader file!") 
    } 

    let shaderHandle: GLuint = glCreateShader(shaderType) 

    //var shaderStringUTF8 = shaderString!.utf8 
    var shaderStringUTF8 = shaderString!.UTF8String 
    //var shaderStringLength: GLint = GLint() // LOL 
    var shaderStringLength: GLint = GLint(shaderString!.length) 
    glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength) 
    //the 2 is number of uniforms 
    glCompileShader(shaderHandle) 

    var compileSuccess: GLint = GLint() 

    glGetShaderiv(shaderHandle, GLenum(GL_COMPILE_STATUS), &compileSuccess) 

    if compileSuccess == GL_FALSE { 
     print("Failed to compile shader \(shaderName!)!") 
     var value: GLint = 0 
     glGetShaderiv(shaderHandle, GLenum(GL_INFO_LOG_LENGTH), &value) 
     var infoLog: [GLchar] = [GLchar](count: Int(value), repeatedValue: 0) 
     var infoLogLength: GLsizei = 0 
     glGetShaderInfoLog(shaderHandle, value, &infoLogLength, &infoLog) 
     let s = NSString(bytes: infoLog, length: Int(infoLogLength), encoding: NSASCIIStringEncoding) 
     print(s) 

     exit(1) 
    } 


    return shaderHandle 

} 

// function compiles vertex and fragment shaders into program. Returns program handle 
func compileShaders() -> GLuint { 

    let vertexShader: GLuint = self.compileShader("SimpleVertex", shaderType: GLenum(GL_VERTEX_SHADER)) 
    let fragmentShader: GLuint = self.compileShader("SimpleFragment", shaderType: GLenum(GL_FRAGMENT_SHADER)) 

    let programHandle: GLuint = glCreateProgram() 
    glAttachShader(programHandle, vertexShader) 
    glAttachShader(programHandle, fragmentShader) 
    glLinkProgram(programHandle) 

    var linkSuccess: GLint = GLint() 
    glGetProgramiv(programHandle, GLenum(GL_LINK_STATUS), &linkSuccess) 
    if linkSuccess == GL_FALSE { 
     print("Failed to create shader program!") 

     var value: GLint = 0 
     glGetProgramiv(programHandle, GLenum(GL_INFO_LOG_LENGTH), &value) 
     var infoLog: [GLchar] = [GLchar](count: Int(value), repeatedValue: 0) 
     var infoLogLength: GLsizei = 0 
     glGetProgramInfoLog(programHandle, value, &infoLogLength, &infoLog) 
     let s = NSString(bytes: infoLog, length: Int(infoLogLength), encoding: NSASCIIStringEncoding) 
     print(s) 

     exit(1) 
    } 

    glUseProgram(programHandle) 

    self.positionSlot = GLuint(glGetAttribLocation(programHandle, "aVertexPosition")) 
    //self.colorSlot = GLuint(glGetAttribLocation(programHandle, "SourceColor")) 
    self.normalSlot = GLuint(glGetAttribLocation(programHandle, "aVertexNormal")) 
    glEnableVertexAttribArray(self.positionSlot) 
    // glEnableVertexAttribArray(self.colorSlot) 
    glEnableVertexAttribArray(self.normalSlot) 

    return programHandle 
}