2015-01-17 3 views
5

iOS 용 OpenGL/GLKit에 대해 this tutorial을 따르고 있지만 Swift에서 구현하려고합니다.이 OpenGL 포인터 수학을 Swift로 변환하려면 어떻게해야합니까?

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

struct TexturedQuad { 

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

그것은 상당히 간단한 구조입니다 만 나는 방법을 모른다 :

- (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이 :이 부분에 얻을 때까지 잘거야 마지막 인수 인 glVertexAttribPointer으로 전달합니다. 어떤 도움이 될 것입니다 항성!

답변

10

스위프트에서 일반 구조체 UnsafePointer을 사용하여 포인터 산술 및 캐스팅을 수행 할 수 있습니다. Swift에는 offsetof이 없지만 geometryVertextextureVertex 요소의 UnsafePointer을 직접 취하여이를 해결할 수 있습니다.

다음 코드는 iOS 놀이터에서 컴파일됩니다. 나는 그 이상을 시험하지 않았다 그러나 나는 그것이 작동 것 같아요 : 위험 CGFloat 변경 대상에 따라 크기 때문에 (그런데

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 당신이 당신의 질문에했던 방법을 사용하여 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

관련 문제