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

Ios 如何将OpenGL指针数学转换为Swift?,ios,swift,opengl-es,glkit,Ios,Swift,Opengl Es,Glkit,我关注的是OpenGL/GLKit for iOS,但试图在Swift中实现它。在我讲到这一部分之前,一切都会好起来的: - (void)render { // 1 self.effect.texture2d0.name = self.textureInfo.name; self.effect.texture2d0.enabled = YES; // 2 [self.effect prepareToDraw]; // 3 glEnableVertexAttribArray(GLK

我关注的是OpenGL/GLKit for iOS,但试图在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
}

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

在Swift中,您可以使用通用结构
UnsafePointer
执行指针运算和强制转换。Swift没有
偏移量
,但您可以通过直接获取
geometryVertex
textureVertex
元素的
UnsafePointer
s来彻底解决这一问题

下面的代码在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问世之前编写的。

太棒了!我还将补充教程中的下一个问题是,大多数GLKit在Swift中都被破坏了,因为Swift缺少
union
。这段代码解决了这个问题,但是,
CGPoint
也不起作用,因为浮动太大了。您必须使用32位
GL\u FLOAT