Ios 参数类型UnsafePointer<;无效>;在元素中

Ios 参数类型UnsafePointer<;无效>;在元素中,ios,swift,opengl-es,Ios,Swift,Opengl Es,我试图让我的上下文(EAGLContext)以Swift格式呈现;但是好几天来,我一直无法使用函数gldrawerelements 我在Stackoverflow上读过几个类似的问题,但都没有用 我的gldrawerelements如下所示: glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offset) 我对最后一个参数--offset有问题,它需要一个非安

我试图让我的
上下文
EAGLContext
)以Swift格式呈现;但是好几天来,我一直无法使用函数
gldrawerelements

我在Stackoverflow上读过几个类似的问题,但都没有用

我的
gldrawerelements
如下所示:

glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offset)
我对最后一个参数--offset有问题,它需要一个
非安全指针

我尝试了以下方法:

let offset: CConstVoidPointer = COpaquePointer(UnsafePointer<Int>(0))
var offset = UnsafePointer<Int>(bitPattern: 0)
glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offset)
上面给出了一个警告,我应该使用
位模式:

虽然我不认为这里应该使用
位模式:
(因为参数需要
),但我决定根据提供的建议进行尝试,例如:

let offset: CConstVoidPointer = COpaquePointer(UnsafePointer<Int>(0))
var offset = UnsafePointer<Int>(bitPattern: 0)
glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offset)
然后将其输入到
glpaurements
的最后一个参数,如下所示:

glDrawElements(GLenum(GL_TRIANGLES), GLsizei(Indices.count), GLenum(GL_UNSIGNED_BYTE), &offsetZero)
我得到了与上述情况相同的
EXE\u BAD\u访问权限

如何正确地形成一个适合于
glpaurements
的最后一个参数的类型,该参数需要类型
UnsafePointer


@罗伯马约夫

更新(添加VBO设置和变量声明和定义的代码):

struct顶点
{
风险值位置:(CFloat,CFloat,CFloat)
变量颜色:(CFloat,CFloat,CFloat,CFloat)
}
变量顶点=
[
顶点(位置:(-1,-1,0),颜色:(1,1,0,1)),
顶点(位置:(1,-1,0),颜色:(1,1,1,1)),
顶点(位置:(-1,0,1),颜色:(0,1,0,1)),
顶点(位置:(-1,1,1),颜色:(1,0,0,1))
]
let索引:[UInt8]=[0,2,3,3,1,0]
类mainGLView:UIView
{
变量层:Caeaglayer!
var-context:EAGLContext!
var cBuffer:GLuint=GLuint()
变量位置:GLuint=GLuint()
变量颜色:GLuint=GLuint()
变量iBuffer:GLuint=GLuint()
var vBuffer:GLuint=GLuint()
var vao:GLuint=GLuint()
重写类func layerClass()->AnyClass
{  
返回caeaglayer.self
}
必需的初始化(编码器aDecoder:NSCoder)
{
super.init(编码者:aDecoder)
//设置上下文、缓冲区、着色器等。
self.configureVBO()
self.setupRendering()
}
func configureVBO()
{
Glgenvertexaraysoes(1和vao);
GLBINDVERTEXARRAOES(vao);
glGenBuffers(GLsizei(1)和vBuffer)
glBindBuffer(GLenum(GL_数组_缓冲区),vBuffer)
glBufferData(GLenum(GL_数组_缓冲区)、顶点.size()、顶点、GLenum(GL_静态_绘制))
GlenableVertexAttributeArray(pos)
var ptr=COpaquePointer(非安全指针(位模式:0))
GLVertexAttributePointer(GLuint(pos)、GLint(3)、GLenum(GL_FLOAT)、GLboolean(GL_FALSE)、GLsizei(sizeof(顶点))、和ptr)
GlenableVertexAttributeArray(彩色)
设fColor=UnsafePointer(位模式:sizeof(Float)*3)
GLVertexAttributePointer(GLuint(color)、4、GLenum(GL_FLOAT)、GLboolean(GL_FALSE)、GLsizei(sizeof(vertex))、fColor)
glGenBuffers(1和iBuffer)
glBindBuffer(GLenum(GLU元素数组缓冲区),iBuffer)
glBufferData(GLenum(GL_元素\数组\缓冲区)、index.size()、index、GLenum(GL_静态\绘制))
glBindBuffer(GLenum(GL_数组_缓冲区),0)
glBindVertexArrayOES(0)
}
func setupRendering()
{
GLBINDVERTEXARRAOES(vao);
glViewport(0,0,闪烁(self.frame.size.width),闪烁(self.frame.size.height));
索引.withUnsafeBufferPointer
{
(指针:UnsafeBufferPointer)->中的Void
GLD元素(GLenum(GL_三角形)、GLsizei(index.count)、GLenum(GL_无符号字节)、UnsafePointer(pointer.baseAddress))
Void()
}
self.context.presentRenderbuffer(Int(GL_RENDERBUFFER))
glBindVertexArrayOES(0)
}
}

由于您选择了
计数
类型
参数,
索引
参数(最后一个参数)需要是指向数组的第一个元素的指针,长度至少为
索引。计数
,无符号字节数。此指针需要在Swift中转换为
UnsafePointer

您没有显示
索引的声明。让我们假设它是这样声明的:

let indices: [UInt8] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]
然后,您可以通过以下方式调用
gldrawerelements

indices.withUnsafeBufferPointer { (pointer: UnsafeBufferPointer<UInt8>) -> Void in
    glDrawElements(GLenum(GL_TRIANGLES), GLsizei(indices.count),
        GLenum(GL_UNSIGNED_BYTE),
        UnsafePointer<Void>(pointer.baseAddress))
    Void()
}
index.withUnsafeBufferPointer{(指针:UnsafeBufferPointer)->中的Void
GLD元素(GLenum(GL_三角形)、GLsizei(Index.count),
GLenum(GL_无符号字节),
非安全指针(指针.基地址))
Void()
}

很抱歉误用了此评论,但我在聊天中找不到您。恭喜你戴上了八个管家徽章。我已经进行了数据查询,您的正确号码将在下周一的DB更新中显示。
indices.withUnsafeBufferPointer { (pointer: UnsafeBufferPointer<UInt8>) -> Void in
    glDrawElements(GLenum(GL_TRIANGLES), GLsizei(indices.count),
        GLenum(GL_UNSIGNED_BYTE),
        UnsafePointer<Void>(pointer.baseAddress))
    Void()
}