如何将此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
,但你可以通过直接获取geometryVertex
和textureVertex
元素的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出现之前编写的。