2015-04-26 51 views
2

我想让我的contextEAGLContext)在Swift中呈现;但几天来我一直无法使用功能glDrawElements工作。参数类型UnsafePointer <Void> in glDrawElements

我已经阅读了Stackoverflow上的一些类似的问题,但无济于事。

glDrawElements如下:

glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offset) 

我有最后一个参数的问题 - 偏移,这需要一个UnsafePointer<Void>

我曾尝试以下:

let offset: CConstVoidPointer = COpaquePointer(UnsafePointer<Int>(0)) 

以上不再起作用,因为CConstVoidPointer似乎并不提供了斯威夫特1.2。

和:

var offset = UnsafePointer<Int>(other: 0) 

以上给出了,我应该使用bitPattern:,而不是警告。

虽然我不相信bitPattern:此处应该使用(因为参数需要一个Word)不,我决定根据提供诸如以下的建议,不妨一试:

var offset = UnsafePointer<Int>(bitPattern: 0) 
glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offset) 

我会得到EXE_BAD_ACCESS (code=EXC_I386_GPFLT)错误。

var offsetZero : Int = 0 

,并随后将其送入的glDrawElements像这样的最后一个参数:

glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offsetZero) 

我收到相同

徒劳的,我也为下面尝试使用简单的东西EXE_BAD_ACCESS就像上面的情况一样。

我该如何正确地形成一个适合最后一个参数glDrawElements的类型,该类型的预期类型为UnsafePointer<Void>


@RobMayoff

更新(VBO为建立和变量的声明和定义添加代码):

struct vertex 
{ 
    var position: (CFloat, CFloat, CFloat) 
    var color: (CFloat, CFloat, CFloat, CFloat) 
} 

var vertices = 
[ 
    vertex(position: (-1, -1, 0) , color: (1, 1, 0, 1)), 
    vertex(position: (1, -1, 0) , color: (1, 1, 1, 1)), 
    vertex(position: (-1, 0, 1) , color: (0, 1, 0, 1)), 
    vertex(position: (-1, 1, 1), color: (1, 0, 0, 1)) 
] 

let indices: [UInt8] = [ 0, 2, 3, 3, 1, 0 ] 

class mainGLView : UIView 
{ 
    var layer : CAEAGLLayer! 
    var context : EAGLContext! 
    var cBuffer : GLuint = GLuint() 
    var pos : GLuint = GLuint() 
    var color : GLuint = GLuint() 
    var iBuffer : GLuint = GLuint() 
    var vBuffer : GLuint = GLuint() 
    var vao : GLuint = GLuint() 

    override class func layerClass() -> AnyClass 
    { 
     return CAEAGLLayer.self 
    } 

    required init(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //setting up context, buffers, shaders, etc. 

     self.configureVBO() 
     self.setupRendering() 
    } 

    func configureVBO() 
    { 

     glGenVertexArraysOES(1, &vao); 
     glBindVertexArrayOES(vao); 

     glGenBuffers(GLsizei(1), &vBuffer) 
     glBindBuffer(GLenum(GL_ARRAY_BUFFER), vBuffer) 
     glBufferData(GLenum(GL_ARRAY_BUFFER), vertices.size(), vertices, GLenum(GL_STATIC_DRAW)) 

     glEnableVertexAttribArray(pos) 


     var ptr = COpaquePointer(UnsafePointer<Int>(bitPattern: 0)) 

     glVertexAttribPointer(GLuint(pos), GLint(3), GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(vertex)), &ptr) 

     glEnableVertexAttribArray(color) 

     let fColor = UnsafePointer<Int>(bitPattern: sizeof(Float) * 3) 

     glVertexAttribPointer(GLuint(color), 4, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(vertex)), fColor) 

     glGenBuffers(1, &iBuffer) 
     glBindBuffer(GLenum(GL_ELEMENT_ARRAY_BUFFER), iBuffer) 
     glBufferData(GLenum(GL_ELEMENT_ARRAY_BUFFER), indices.size(), indices, GLenum(GL_STATIC_DRAW)) 

     glBindBuffer(GLenum(GL_ARRAY_BUFFER), 0) 
     glBindVertexArrayOES(0) 
    } 

    func setupRendering() 
    { 
     glBindVertexArrayOES(vao); 
     glViewport(0, 0, GLint(self.frame.size.width), GLint(self.frame.size.height)); 

     indices.withUnsafeBufferPointer 
     { 
      (pointer : UnsafeBufferPointer<UInt8>) -> Void in 
      glDrawElements(GLenum(GL_TRIANGLES), GLsizei(indices.count), GLenum(GL_UNSIGNED_BYTE), UnsafePointer<Void>(pointer.baseAddress)) 
      Void() 
     } 

     self.context.presentRenderbuffer(Int(GL_RENDERBUFFER)) 

     glBindVertexArrayOES(0) 
    } 
} 
+1

对不起滥用此评论,但我无法找到你聊天。恭喜所有八个管家徽章[so]。我已经做出[此](https://data.stackexchange.com/stackoverflow/query/311167/most-steward-badges-by-number-and-date)数据查询,您的正确号码应在下周一显示与数据库更新。 – Anthon

回答

1

因为你选择了counttype论点,indices参数(最后一个参数)需要是指向数组的第一个元素的指针,(至少)le ,无符号字节。该指针需要在Swift中转换为UnsafePointer<Void>

您没有显示您的Indices的声明。让我们假设它的声明如下:

let indices: [UInt8] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ] 

然后你就可以通过这些箍跳叫glDrawElements

indices.withUnsafeBufferPointer { (pointer: UnsafeBufferPointer<UInt8>) -> Void in 
    glDrawElements(GLenum(GL_TRIANGLES), GLsizei(indices.count), 
     GLenum(GL_UNSIGNED_BYTE), 
     UnsafePointer<Void>(pointer.baseAddress)) 
    Void() 
} 
相关问题