2015-01-17 39 views
5

我正在關注關於OpenGL/GLKit for iOS的this tutorial,但試圖在Swift中實現它。它會很好,直到我到了這個部分:如何將此OpenGL指針數學轉換爲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這是一個斯威夫特結構是這樣的:

struct TexturedVertex { 
let geometryVertex: CGPoint 
let textureVertex: CGPoint 
} 

struct TexturedQuad { 

let bottomLeft: TexturedVertex 
let bottomRight: TexturedVertex 
let topLeft: TexturedVertex 
let topRight: TexturedVertex 
} 

這是一個相當簡單的結構,但我不知道如何將其傳遞給glVertexAttribPointer的最後一個參數。任何幫助將是恆星!

回答

10

在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發佈之前編寫的。

+0

非常好!我還會在教程中添加下一個問題,因爲Swift缺少'union',所以大部分GLKit都在Swift中被破壞。這段代碼解決了這個問題,雖然https://github.com/programmingthomas/OpenGL.swift – jbrennan

+0

另外,是的,'CGPoint'不工作,因爲浮點數太大。你必須使用32位'GL_FLOAT'。 – jbrennan