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

标签 ios swift opengl-es glkit

我正在关注 this tutorial关于 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,但您可以通过采用 geometryVertextextureVertexUnsafePointer 来彻底解决这个问题> 直接元素。

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

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 发布之前编写的。

关于ios - 如何将此 OpenGL 指针数学转换为 Swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27995833/

相关文章:

iphone - 关闭 iOS 6 上的 Modal ViewController 动画崩溃

swift - 将 Objective-C 框架导入 Swift 项目时在 Bridging Header 中获取 "file not found"

ios - 向 Core Data Swift 3 中插入​​两行数据

android - Opengl-es手动调用onDrawFrame

c - 尝试绑定(bind)帧缓冲区或附加渲染缓冲区时操作无效

iphone - 如何在 OpenGL ES 1.1 中优化大型模型的渲染?

ios - 导航 Controller 后标签栏出现黑屏

ios - Swift NSObject 属性不是可选的,但它打印可选

ios - 如何制作 float View ?

iphone - 如何让 UITableViewCell 的 subview 扩展到单元格的边界之外