2015-04-26 54 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() 
} 
相關問題