【问题标题】:How do I convert this OpenGL pointer math to Swift?如何将此 OpenGL 指针数学转换为 Swift?
【发布时间】:2015-03-15 18:12:36
【问题描述】:

我正在关注 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的最后一个参数。任何帮助都会很重要!

【问题讨论】:

    标签: ios swift opengl-es glkit


    【解决方案1】:

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

    以下代码在 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 出现之前编写的。

    【讨论】:

    • 太棒了!我还将在教程中添加下一个问题,因为 Swift 缺少 union,所以大部分 GLKit 在 Swift 中被破坏了。这段代码解决了这个问题github.com/programmingthomas/OpenGL.swift
    • 另外,是的,CGPoint 不起作用,因为浮点数太大。您必须使用 32 位 GL_FLOAT
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多