2019年2月20日水曜日

SwiftでGLを動かす


開発環境
Xcode 10.1


プロジェクトの作成 

iOS, Single View App を作成する



プロジェクトのオプション

Swiftで作成



Viewクラスを変更


Main.storyboardのViewのCustom Classを「GLKView」に変更する。



ソースコードの変更


ViewController.swiftのコードを以下に変更する。

////////////////////////////////////// ここから 
//
//  ViewController.swift
//  GLSimple

import GLKit

import OpenGLES

class ViewController: GLKViewController {


    var context: EAGLContext? = nil

    
    deinit {
        self.tearDownGL()
        if EAGLContext.current() === self.context {
            EAGLContext.setCurrent(nil)
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.        
        self.context = EAGLContext(api: .openGLES2)
        if !(self.context != nil) {
            print("Failed to create ES context")
        }
        
        let view = self.view as! GLKView
        view.context = self.context!
        view.drawableDepthFormat = .format24
        
        self.setupGL()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
        if self.isViewLoaded && (self.view.window != nil) {
            self.view = nil
            self.tearDownGL()
            
            if EAGLContext.current() === self.context {
                EAGLContext.setCurrent(nil)
            }
            self.context = nil
        }
    }
    func setupGL() {
        EAGLContext.setCurrent(self.context)
        // TODO
    }
    
    func tearDownGL() {
        EAGLContext.setCurrent(self.context)
        // TODO
    }
    
    // MARK: - GLKView and GLKViewController delegate methods
    func update() {
    }
    
    override func glkView(_ view: GLKView, drawIn rect: CGRect) {
        glClearColor(0.65, 0.65, 0.65, 1.0)
        glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
        
        // Render the object with GLKit
        glEnable(GLenum(GL_SCISSOR_TEST))
        glScissor(GLsizei(view.drawableWidth/4), GLsizei(view.drawableHeight/4),
GLsizei(view.drawableWidth/2), GLsizei(view.drawableHeight/2))
        glClearColor(0.65, 0.0, 0.65, 1.0)
        glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
        glDisable(GLenum(GL_SCISSOR_TEST))
    }
}
//////////////////////////////////////////////// ここまで


実行結果