如何将此OpenGL指针数学转换为Swift?

我正在关注关于iOS的OpenGL / GLKit的本教程 ,但试图在Swift中实现它。 在我到达这个部分之前一切正常:

- (void)render { // 1 self.effect.texture2d0.name = self.textureInfo.name; self.effect.texture2d0.enabled = YES; // 2 [self.effect prepareToDraw]; // 3 glEnableVertexAttribArray(GLKVertexAttribPosition); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); //---------------- This is where things break down... long offset = (long)&_quad; glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex))); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex))); // 5 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @end 

我有一个属性self.quad ,这是一个像这样的Swift结构:

 struct TexturedVertex { let geometryVertex: CGPoint let textureVertex: CGPoint } struct TexturedQuad { let bottomLeft: TexturedVertex let bottomRight: TexturedVertex let topLeft: TexturedVertex let topRight: TexturedVertex } 

这是一个相当简单的结构,但我不知道如何将它传递给glVertexAttribPointer的最后一个参数 。 任何帮助都会很棒!

在Swift中,您可以使用通用结构UnsafePointer来执行指针算法和转换。 Swift没有offsetof ,但你可以通过直接获取geometryVertextextureVertex元素的UnsafePointer来干净地解决这个问题。

以下代码在iOS操场中编译。 我没有测试过它,但我认为它会起作用:

 import OpenGLES import GLKit struct TexturedVertex { var geometryVertex = GLKVector2() var textureVertex = GLKVector2() } struct TexturedQuad { var bl = TexturedVertex() var br = TexturedVertex() var tl = TexturedVertex() var tr = TexturedVertex() init() { } } var _quad = TexturedQuad() withUnsafePointer(&_quad.bl.geometryVertex) { (pointer) -> Void in glVertexAttribPointer(GLuint(GLKVertexAttrib.Position.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(TexturedVertex)), pointer) } withUnsafePointer(&_quad.bl.textureVertex) { (pointer) -> Void in glVertexAttribPointer(GLuint(GLKVertexAttrib.TexCoord0.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(TexturedVertex)), pointer) } 

顺便说一句,使用CGPoint你在问题中的方式是危险的,因为CGFloat根据你的目标(32位或64位)改变大小,但GL_FLOAT总是意味着32位。 您正在关注的教程是在64位iOS出现之前编写的。