2017-12-08 6 views
-1

シェーダをコンパイルするためのコードを記述しました。シェーダを迅速にコンパイルする方法、場所は常に-1を返します

class DFShader { 
    let ID: GLuint 

    init(vPath: String, fPath: String) { 
     ID = glCreateProgram() 
     let vertex = compile(type: GLenum(GL_VERTEX_SHADER), path: vPath) 
     let fragment = compile(type: GLenum(GL_FRAGMENT_SHADER), path: fPath) 

     var success: GLint = 1 
     glAttachShader(ID, vertex) 
     glAttachShader(ID, fragment) 
     glLinkProgram(ID) 
     glGetProgramiv(ID, GLenum(GL_LINK_STATUS), &success) 
     if success == GL_FALSE { 
      let infoLog = UnsafeMutablePointer<GLchar>.allocate(capacity: 512) 
      glGetProgramInfoLog(ID, 512, nil, infoLog) 
      print("link program error. \(String.init(cString: infoLog))") 
     } 
     glDeleteShader(vertex) 
     glDeleteShader(fragment) 

     //log 
     print("model", glGetUniformLocation(ID, "model")) // print 4 
     print("projection", glGetUniformLocation(ID, "projection")) // print 0 
     print(ID.description) 
    } 

    private func compile(type: GLenum, path: String) -> GLuint { 
     let shader = glCreateShader(type) 
     var success: GLint = 1 
     do { 
      let source = try String.init(contentsOfFile: path, encoding: String.Encoding.utf8).cString(using: String.Encoding.utf8) 
      var castSource = UnsafePointer<GLchar>(source) 
      glShaderSource(shader, 1, &castSource, nil) 
      glCompileShader(shader) 
      glGetShaderiv(shader, GLenum(GL_COMPILE_STATUS), &success) 
      if success == GL_FALSE { 
       let infoLog = UnsafeMutablePointer<GLchar>.allocate(capacity: 512) 
       glGetShaderInfoLog(shader, 512, nil, &infoLog.pointee) 
       print("compile error. \(String.init(cString: infoLog))") 
      } 
     } catch { 
      print("failed to read from shader source file.") 
     } 
     return shader 
    } 

    func use() { 
     glUseProgram(ID) 
    } 
} 

//vertex shader code 
#version 300 es 
layout(location = 0) in vec2 position; 
out vec4 VertexColor; 
uniform mat4 model; 
uniform mat4 projection; 
uniform float pointSize; 
uniform vec4 color; 
void main() { 
    VertexColor = color; 
    gl_Position = projection * model * vec4(position, 0.0, 1.0); 
gl_PointSize = 10.0f; 
} 

//fragment shader code 
#version 300 es 
precision mediump float; 
out vec4 FragColor; 
in vec4 VertexColor; 
void main() { 
    FragColor = VertexColor; 
} 

//In the view 
... 
func setupShaders() { 
    shader.use() 
    let projection = GLKMatrix4MakeOrtho(0, Float(width), 0, Float(height), -1, 1) 
    shader.setMat4(name: "projection", value: projection) 
    print("projection", glGetUniformLocation(shader.ID, "projection")) // print -1. 

... 
} 

私はすべて均一と属性値の右の位置を取得したいです。

しかし、DFShaderインスタンスから得られる一様な場所は-1です。そして、私は上記のコードで0と4を表示し、

でしか正しい場所を取得しません。私は

setupShaders() 

に場所を得るとき はしかし、それは-1を返します。私はshader.IDで場所を取得し、他の場所では、私も-1を与えられます。

+0

均一変数の位置を取得するには、プログラムをリンクする必要があります。つまり、 'glGetUniformLocation'は' glLinkProgram'の後に呼び出さなければなりません。 – Rabbid76

答えて

1

シェーダオブジェクトの位置が一様ではありません。 プログラムオブジェクトのみが行います。

shader objectは、テキストシェーダと最終的なプログラムの間の仲介者にすぎません。実際にはを実行しないでください多く。彼らは照会する状態を持っていません。

+0

ありがとう、私は間違いをしました。しかし、私のプログラムをリンクした後、私は一様な場所を取得することはできません。上記の質問は編集済みです –