2015-01-17 8 views
5

मैं आईओएस के लिए ओपनजीएल/जीएलकिट के बारे में this tutorial का पालन कर रहा हूं लेकिन इसे स्विफ्ट में कार्यान्वित करने की कोशिश कर रहा हूं। जब तक मैं इस हिस्से के लिए मिलता है यह ठीक हो रहा है:मैं इस ओपनजीएल पॉइंटर गणित को स्विफ्ट में कैसे परिवर्तित करूं?

- (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 इस तरह है:

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

struct TexturedQuad { 

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

यह एक काफी सरल संरचना है, लेकिन मैं पता नहीं कैसे glVertexAttribPointer के अंतिम तर्क को पास करने के लिए। कोई मदद तारकीय होगा!

उत्तर

10

स्विफ्ट में, आप पॉइंटर अंकगणित और कास्टिंग करने के लिए सामान्य संरचना UnsafePointer का उपयोग कर सकते हैं। स्विफ्ट में offsetof नहीं है, लेकिन आप geometryVertex और textureVertex तत्वों को सीधे UnsafePointer ले कर साफ-सफाई कर सकते हैं।

निम्नलिखित कोड आईओएस खेल के मैदान में संकलित करता है। मैं यह है कि परे परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह काम करेंगे:

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-बिट आईओएस आने से पहले लिखा गया था।

+0

उत्कृष्ट! मैं ट्यूटोरियल में अगली समस्या भी जोड़ूंगा, अधिकांश जीएलकिट स्विफ्ट में फंस गया है क्योंकि स्विफ्ट में 'यूनियन' की कमी है। कोड का यह बिट समस्या के आसपास आता है हालांकि https://github.com/programmingthomas/OpenGL.swift – jbrennan

+0

इसके अलावा, हाँ, 'CGPoint' काम नहीं करता है क्योंकि फ्लोट बहुत बड़ी हैं। आपको 32 बिट 'GL_FLOAT' का उपयोग करना होगा। – jbrennan

संबंधित मुद्दे

 संबंधित मुद्दे