OpenGL纹理不在iOS上显示,使用Swift
我想在iOS上使用Swift显示OpenGLES2的纹理,但不幸的是纹理没有显示:-(。我不知道我做错了什么。显然“测试纹理”加载正确(并且是POT)。可能对GlenableVertexAttributeArray的调用错误OpenGL纹理不在iOS上显示,使用Swift,ios,swift,opengl-es,Ios,Swift,Opengl Es,我想在iOS上使用Swift显示OpenGLES2的纹理,但不幸的是纹理没有显示:-(。我不知道我做错了什么。显然“测试纹理”加载正确(并且是POT)。可能对GlenableVertexAttributeArray的调用错误 func BUFFER_OFFSET(i: Int) -> UnsafePointer<Void> { let p: UnsafePointer<Void> = nil return p.advancedBy(i) } let
func BUFFER_OFFSET(i: Int) -> UnsafePointer<Void> {
let p: UnsafePointer<Void> = nil
return p.advancedBy(i)
}
let vertices:[GLfloat] = [
// Positions // Colors // Texture Coords
0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, // Top Right
0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, // Bottom Right
-0.5, -0.5, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Bottom Left
-0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0 // Top Left
]
let indices:[GLuint] = [ // Note that we start from 0!
0, 1, 3, // First Triangle
1, 2, 3 // Second Triangle
]
func setupGL() {
EAGLContext.setCurrentContext(self.context)
self.loadShaders()
self.effect = GLKBaseEffect()
self.effect!.light0.enabled = GLboolean(GL_TRUE)
self.effect!.light0.diffuseColor = GLKVector4Make(1.0, 0.4, 0.4, 1.0)
do {
testTexture = try GLKTextureLoader.textureWithContentsOfFile(NSBundle.mainBundle().pathForResource("MyTexture1024x1024", ofType: "png")!, options: [GLKTextureLoaderOriginBottomLeft:true, GLKTextureLoaderApplyPremultiplication:true])
print("successfully loaded test texture")
}
catch let error as NSError {
print("could not load test texture \(error)")
}
glEnable(GLenum(GL_DEPTH_TEST))
glGenVertexArraysOES(1, &vertexArray)
glBindVertexArrayOES(vertexArray)
glGenBuffers(1, &vertexBuffer)
glBindBuffer(GLenum(GL_ARRAY_BUFFER), vertexBuffer)
glBufferData(GLenum(GL_ARRAY_BUFFER), GLsizeiptr(sizeof(GLfloat) * vertices.count), vertices, GLenum(GL_STATIC_DRAW))
glGenBuffers(1, &indexBuffer)
glBindBuffer(GLenum(GL_ELEMENT_ARRAY_BUFFER), indexBuffer)
glBufferData(GLenum(GL_ELEMENT_ARRAY_BUFFER), GLsizeiptr(sizeof(GLfloat) * indices.count), indices, GLenum(GL_STATIC_DRAW))
glEnableVertexAttribArray(GLuint(GLKVertexAttrib.Position.rawValue))
glVertexAttribPointer(GLuint(GLKVertexAttrib.Position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(GLfloat) * 8), BUFFER_OFFSET(0))
glEnableVertexAttribArray(GLuint(GLKVertexAttrib.TexCoord0.rawValue))
glVertexAttribPointer(GLuint(GLKVertexAttrib.TexCoord0.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(GLfloat) * 8), BUFFER_OFFSET(sizeof(GLfloat) * 6))
glBindVertexArrayOES(0)
}
override func glkView(view: GLKView, drawInRect rect: CGRect) {
glClearColor(0.65, 0.65, 0.65, 1.0)
glClear(GLbitfield(GL_COLOR_BUFFER_BIT) | GLbitfield(GL_DEPTH_BUFFER_BIT))
//use specified vertex buffer
glBindVertexArrayOES(vertexArray)
//use specified index buffer
glBindBuffer(GLenum(GL_ELEMENT_ARRAY_BUFFER), indexBuffer)
glEnable(GLenum(GL_BLEND));
glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA));
self.effect!.texture2d0.name = testTexture.name
self.effect!.texture2d0.enabled = 1
// Render the object with GLKit
self.effect!.prepareToDraw()
glDrawElements(GLenum(GL_TRIANGLES), 6, GLenum(GL_UNSIGNED_INT), nil)
}
func缓冲区\u偏移量(i:Int)->UnsafePointer{
设p:UnsafePointer=nil
返回p.advancedBy(一)
}
让顶点:[GLfloat]=[
//位置//颜色//纹理坐标
0.5,0.5,0.0,1.0,0.0,0.0,1.0,1.0,//右上角
0.5,-0.5,0.0,0.0,1.0,0.0,1.0,0.0,//右下角
-0.5,-0.5,0.0,0.0,0.0,1.0,0.0,0.0,//左下角
-0.5,0.5,0.0,1.0,1.0,0.0,0.0,1.0//左上角
]
让索引:[GLuint]=[//注意我们从0开始!
0,1,3,//第一个三角形
1,2,3//第二个三角形
]
func setupGL(){
EAGLContext.setCurrentContext(self.context)
self.loadShaders()
self.effect=glkbaseffect()
self.effect!.light0.enabled=GLboolean(GL\u TRUE)
self.effect!.light0.diffuseColor=GLKVector4Make(1.0,0.4,0.4,1.0)
做{
testTexture=try GLKTextureLoader.textureWithContentsOfFile(NSBundle.mainBundle().pathForResource(“MyTexture1024”,类型:“png”)!,选项:[GLKTextureLoaderOriginBottomLeft:true,GLKTextureLoaderApplyPremultiplication:true])
打印(“已成功加载测试纹理”)
}
将let错误捕获为NSError{
打印(“无法加载测试纹理\(错误)”)
}
峡谷(峡谷(GL_深度_测试))
glGenVertexArraysOES(1和vertexArray)
GLBindVertexArray(vertexArray)
glGenBuffers(1和vertexBuffer)
glBindBuffer(格伦(格伦数组缓冲区)、顶点缓冲区)
glBufferData(GLenum(GL_数组_缓冲区)、GLsizeiptr(sizeof(GLfloat)*顶点数)、顶点、GLenum(GL_静态_绘制))
glGenBuffers(1和indexBuffer)
glBindBuffer(格伦(格伦元素数组缓冲区),索引缓冲区)
glBufferData(GLenum(GL_元素\数组\缓冲区)、GLsizeiptr(sizeof(GLfloat)*index.count)、index、GLenum(GL_STATIC\ u DRAW))
glEnableVertexAttribArray(GLuint(GLKVertexAttrib.Position.rawValue))
glVertexAttribPointer(GLINT(GLKVertexAttrib.Position.rawValue),3,GLenum(GL_FLOAT),GLboolean(GL_FALSE),GLsizei(sizeof(GLfloat)*8),缓冲区偏移(0))
glEnableVertexAttribArray(GLuint(GLKVertexAttrib.TexCoord0.rawValue))
glVertexAttribPointer(GLuint(GLKVertexAttrib.TexCoord0.rawValue)、2、GLenum(Glu浮点)、GLboolean(Glu假)、GLsizei(sizeof(GLfloat)*8)、缓冲区偏移(sizeof(GLfloat)*6))
glBindVertexArrayOES(0)
}
覆盖func glkView(视图:glkView,drawInRect rect:CGRect){
glClearColor(0.65,0.65,0.65,1.0)
glClear(GLbitfield(GL_颜色_缓冲_位)| GLbitfield(GL_深度_缓冲_位))
//使用指定的顶点缓冲区
GLBindVertexArray(vertexArray)
//使用指定的索引缓冲区
glBindBuffer(格伦(格伦元素数组缓冲区),索引缓冲区)
glEnable(glEnable(Glenaum(Glu混合物));
glBlendFunc(盂(GL_SRC_ALPHA),盂(GL_ONE_减去glu SRC_ALPHA));
self.effect!.texture2d0.name=testTexture.name
self.effect!.texture2d0.enabled=1
//使用GLKit渲染对象
self.effect!.prepareToDraw()
GLD元素(格伦(格伦三角形),6,格伦(格伦无符号),无)
}
最后,我找到了问题的原因,这是上面未包含的以下代码(在setupGL()中):
所以原因实际上是灯。当它被禁用时,它会工作
self.effect = GLKBaseEffect()
self.effect!.light0.enabled = GLboolean(GL_FALSE)
self.effect = GLKBaseEffect()
self.effect!.light0.enabled = GLboolean(GL_FALSE)