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