4
A
答えて
3
私の知る限りでは、あなたが設定し、非GLKitのOpenGL ES 2.0アプリケーションと同じようにシェーダプログラムを使用します。私は現在、毎回シェーダのコンパイルとリンクの定型コードをすべて書き直すのではなく、this tutorialの一部として提供しているJeff LaMarcheのGLProgramラッパークラスを使用することを好みます(コードはそのページの上部にリンクする必要があります)。
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
}
関連する問題
- 1. GLKitと一緒にカスタムシェーダーを使用する方法
- 2. GLKit(iOS 5)でGL_POINTSを使用する
- 3. iOSでGLKitを使用して透明で3Dシェイプをレンダリングする方法
- 4. iOS用のGLKitでVBOを使用するには?
- 5. IOS4アプリでGLKitをリンクする方法はありますか?
- 6. GLKitを使用したクロスプラットフォーム開発ですか?
- 7. GLKit:スウィフト
- 8. クォータニオンによるアークボールの回転(iOS GLKitを使用)
- 9. GLKitでOpenGL ESオブジェクトを回転する
- 10. フルスクリーン表示を使わずにiOS GLKitを使用できますか?
- 11. IOS5 GLKit GLViewと新しいGLKit GLViewの参照で
- 12. GLKit/OpenGL-ESで法線を自動的に計算する
- 13. GLKit。 GLKVector3のコンポーネントに割り当てる方法
- 14. GLKitを使ったオンデマンドOpenGL ESレンダリング
- 15. GLKitメモリリークcopywithZone
- 16. GLKitで三角形を見る
- 17. GLKitのGLKMatrixStackライブラリを使用してモデルビューマトリックスを生成するには?
- 18. GLKit&テクスチャにテクスチャを追加する
- 19. キューブのIOS GLKitテクスチャ
- 20. カスタムシェーダーなしのXNA 3D/WP7ポイントライト
- 21. OpenGLとGLKitを使ったタイルベースのゲームでパフォーマンスが低い
- 22. imap_searchで 'ALL'を使用する方法と使用方法
- 23. OpenGL Es 2.0 GLKit Draw Pixel
- 24. OpenGL ES 2.0 GLKit線を描く
- 25. Windows Phoneのカスタムシェーダーにエラーがありますか?
- 26. in_categoryでテーマオプションを使用する方法
- 27. INをxmlreaderで使用する方法
- 28. ResultReceiverをAIDLで使用する方法
- 29. ルールでサービスを使用する方法
- 30. トランザクションでoracledataadapterを使用する方法?