シェーダをコンパイルするためのコードを記述しました。シェーダを迅速にコンパイルする方法、場所は常に-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を与えられます。
均一変数の位置を取得するには、プログラムをリンクする必要があります。つまり、 'glGetUniformLocation'は' glLinkProgram'の後に呼び出さなければなりません。 – Rabbid76