4
A
回答
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
}
相關問題
- 1. 自定義着色器GPUImage和GLKIT IOS
- 2. GLKit的GLKBaseEffect和自定義着色器
- 3. Three.js自定義着色器與紋理
- 4. 自定義着色器 - Three.js
- 5. OpenGL使用着色器定義顏色
- 6. Windows Phone自定義着色器錯誤?
- 7. 自定義着色器SCNProgram iOS 9 Scenekit
- 8. 動畫自定義着色器/ three.js所
- 9. 自定義phong着色器envMap翻轉
- 10. 使用自定義着色器使粒子「閃爍」
- 11. 通行證自定義屬性自定義片段着色器
- 12. OpenGL使用內置的照明或自定義的着色器
- 13. 在Silverlight 5中使用自定義着色器XNA
- 14. 使用自定義着色器渲染「硬」邊緣
- 15. 使用自定義着色器在世界風的Java/JOGL
- 16. iOS10 + SceneKit:使用自定義着色器渲染視頻
- 17. THREE.js自定義着色器不能正常地使用
- 18. 對着色自定義幾何體的平面着色
- 19. 如何透明Unity3D自定義着色器?
- 20. 如何在Android中實現自定義着色器
- 21. GLSL:ShaderMaterial與自定義着色器是不是透明
- 22. 如何在unity3d中使用自定義屬性製作輪廓着色器
- 23. 自定義着色器中的光線位置(着色器材質)
- 24. android:如何使用自定義顏色?
- 25. Three.js中真正簡單的自定義着色器 - 如何使其工作?
- 26. 訪問來自glsl着色器的自定義數據
- 27. 使用着色器
- 28. 自定義emacs語法着色
- 29. 自定義HLSL着色跨越icosphere
- 30. VS.PHP自定義語法着色