OpenGL纹理不在iOS上显示,使用Swift

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

我想在iOS上使用Swift显示OpenGLES2的纹理,但不幸的是纹理没有显示:-(。我不知道我做错了什么。显然“测试纹理”加载正确(并且是POT)。可能对GlenableVertexAttributeArray的调用错误

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)