Swift 3 and OpenGL on Linux and macOS with GLFW
https://solarianprogrammer.com/2016/11/19/swift-opengl-linux-macos-glfw/
Swift 3 and OpenGL on Linux and macOS with GLFW
Posted on November 19, 2016 by Sol
This is a short article about how to get started with Swift 3 and OpenGL on Linux and macOS. In order to keep the code portable on both operating systems, we’ll use GLFW to create a window with an OpenGL context. Keep in mind that, at time of this writing, Swift can call directly any C library. However, if you need to use a C++ library you will need to write a C wrapper around it, because Swift 3 is not interoperable with C++.
As a practical example, we’ll use OpenGL to draw a yellow rectangle on a red background. In order to keep the code short and as simple as possible, we’ll use the fixed OpenGL functionality. If you want to use modern OpenGL, please check my other OpenGL articles. Replacing the fixed OpenGL functionality from the article example is left as an exercise for the reader. Basically, once you know how to call OpenGL functions from Swift and compile the code, it is just a question of writing supporting code for dealing with shaders, buffers and so on.
macOS prerequisites:
On macOS, first you need to install Xcode from the App Store. Start Xcodeand agree with the license.
Next, install Apple’s Command Line Tools with:
1 xcode-select --install
Once the above is installed, install the Homebrew package manager:
1 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Next, we’ll use Homebrew to install GLFW:
1 brew install homebrew/versions/glfw3
Ubuntu Linux prerequisites:
If you don’t have latest versions of Swift and Clang installed on your system, check my Getting started with Swift 3 on Linux article.
Next step is to install GLFW:
1 sudo apt install libglfw3-dev libglfw3
Swift OpenGL example
At this point, I assume that you can build and run a Swift code from your Terminal. Assuming that you have a simple Swift program saved as test.swift, this is how you can compile and run the code:
1 swiftc test.swift
2 ./test
In order to use a C function from Swift, we need to let the compiler know the function definition. This can be done using an Objective-C header file. For example, if we want to use GLFW from Swift, we will add the next line in a file ending in .h:
1 #include <GLFW/glfw3.h>
I’ll assume the above line was saved in a file named opengl_includes.h.
Next, we can write our Swift code that uses GLFW and OpenGL functions:
1 import Foundation
2
3 #if os(OSX)
4 import OpenGL
5 #endif
6
7 // Initialize GLFW
8 if(glfwInit() == 0) {
9 print("Failed to initialize GLFW! I'm out!")
10 exit(-1)
11 }
12
13
14 // Open a window and attach an OpenGL context to the window surface
15 guard let window = glfwCreateWindow(600, 600, "OpenGL test - Swift", nil, nil)
16 else {
17 print("Failed to open a window! I'm out!")
18 glfwTerminate()
19 exit(-1)
20 }
21
22 // Set the window context current
23 glfwMakeContextCurrent(window)
24
25 // Print the OpenGL version currently enabled on your machine
26 let version = String(cString: glGetString(UInt32(GL_VERSION)))
27 print(version)
28
29 // Use red to clear the screen
30 glClearColor(1, 0, 0, 1)
31
32 while (glfwWindowShouldClose(window) == 0) {
33 // Clear the screen (window background)
34 glClear(UInt32(GL_COLOR_BUFFER_BIT))
35
36 // Draw a square using the (deprecated) fixed pipeline functionality
37 glColor3f(1.0, 1.0, 0.0)
38 glBegin(UInt32(GL_QUADS))
39 glVertex2f(-0.5, -0.5)
40 glVertex2f(0.5, -0.5)
41 glVertex2f(0.5, 0.5)
42 glVertex2f(-0.5, 0.5)
43 glEnd()
44
45 // Swap front and back buffers for the current window
46 glfwSwapBuffers(window)
47
48 // Poll for events
49 glfwPollEvents()
50 }
51
52 // Destroy the window and its context
53 glfwDestroyWindow(window)
54
55 // Terminate GLFW
56 glfwTerminate()
Save the above code as main.swift.
macOS compilation:
At this point, you should have two files opengl_includes.h and main.swift in your current directory. Use the next command to create an executable:
1 xcrun -sdk macosx swiftc main.swift -I /usr/local/include -import-objc-header opengl_includes.h -L /usr/local/lib -lglfw3
2 ./main
This is what you should see:

Ubuntu Linux compilation
At this point, you should have two files opengl_includes.h and main.swift in your current directory. Use the next command to create an executable:
1 swiftc main.swift -import-objc-header opengl_includes.h -lglfw -lGL
2 ./main
This is what you should see:

If you are interested to learn more about the Swift 3 syntax, I would recommend reading Swift Programming: The Big Nerd Ranch Guide (2nd Edition) by M Mathias, J Gallagher:

If you are interested to learn more about OpenGL, I would recommend reading OpenGL SuperBible by Graham Sellers, Richard S. Wright Jr., Nicholas Haemel:

大概步骤
在终端完成
1.安装
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2.brew install homebrew/versions/glfw3
3.在任何路径下新建文件 opengl_includes.h main.swift
4.在当前路径下执行
①.xcrun -sdk macosx swiftc main.swift -I /usr/local/include -import-objc-header opengl_includes.h -L /usr/local/lib -lglfw3
②./main
Swift 3 and OpenGL on Linux and macOS with GLFW的更多相关文章
- Vysor破解助手for Linux and macOS
<Vysor Pro破解助手>提供了Windows下的Vysor破解工具,为了使用Linux及macOS同学的方便,最近整理了Linux及macOS版的Vysor破解助手. Linux版V ...
- Vmware中Linux或macOS客户端如何回收硬盘空间
Vmware对于Windows的客户端,使用GUI操作硬盘回收和整理磁盘即可.对于Linux或macOS客户端,需要在安装Vmware Tools之后,在客户端OS的终端Terminal里输入命令进行 ...
- MAVLink Linux/QNX/MacOs Integration Tutorial (UDP)
MAVLink Linux/QNX/MacOs Integration Tutorial (UDP) Overview This program was written to test the udp ...
- 深蓝词库转换2.5发布——支持微软五笔,支持Linux和macOS和更多命令行功能
最近利用晚上的时间,对很久没有新版本发布的深蓝词库转换进行了版本升级.本次升级主要包含的功能包括: 一.支持Win10自带的微软五笔输入法用户自定义短语的导入导出. 1.在转换输入法词库列表中选择“W ...
- [Linux实践] macOS平台Homebrew更新brew update卡死,完美解决
[Linux实践] macOS 平台 Homebrew 更新 brew update 卡死,完美解决 版本2020.01.05 摘要: 使用brew install [软件包]安装软件包时,卡在Upd ...
- OpenGL开发学习指南二(glfw+glad)
版权声明:本文为博主原创文章,未经博主允许不得转载.blog.liujunliang.com.cn https://blog.csdn.net/qq_33747722/article/details/ ...
- 在Mac 上搭建Linux虚拟机--MacOS & VMware10 & CentOS 7
在大型项目开发中, 需要使用Linux下的C语言对工程进行开发, 在个人PC或者工作站上搭建Linux系统十分容易且方便. 本篇文章将介绍操作系统和虚拟机的搭建: 1 操作系统2 虚拟机概念3 Lin ...
- 三类安装VMTools失败的解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
- 安装VMTools失败的三类解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
随机推荐
- oracle打补丁
oracle 数据库补丁安装(单实例) ------------24006111 注:务必先安装24006111再安装24315821,否则无法进行正常的补丁安装流程.1.关闭数据库监听和数据库实例 ...
- vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法
---恢复内容开始--- 最近在安装了vsftpd后 添加了虚拟账户后 新建用户 为新用户创立独立的工作目录 因为虚拟用户在工作目录需要上传文件 所以必须拥有此目录的W权限,但每当给此目录加上W权限后 ...
- mysql事务
1. 事务并不专属于mysql 2. 事务的ACID特性 1)原子性(atomicity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中得所有操作要么全部提交成功,要么全部失败回滚,对于一 ...
- Lintcode 175. 翻转二叉树
-------------------- 递归那么好为什么不用递归啊...我才不会被你骗...(其实是因为用惯了递归啰嗦的循环反倒不会写了...o(╯□╰)o) AC代码: /** * Definit ...
- Ubuntu下安装JDK以及相关配置
1.查看系统位数,输入以下命令即可 getconf LONG_BIT 2.下载对应的JDK文件,我这里下载的是jdk-8u60-linux-64.tar.gz 3.创建目录作为JDK的安装目录,这里选 ...
- Python 修改电脑DNS
Pc电脑一般连网都是动态DHCP获取局域的IP地址,而且DNS服务器为自动获取地址.要修改DNS就要打开本地网络-本地连接- 属性- TCP/IP 手动修改DNS. 其实Python也可以通过WMI接 ...
- Android-Menu [使用C# And Java实现]
本篇是对安卓菜单使用编程方式实现,当然可以使用XML的方式完成同样的功能,基本Java和C#写法都是一致的,所以使用XML的方式在本篇中使用Java演示,需要注意的是,对于如果不是VS开发的话,那么资 ...
- android shape的使用(转)
shape用于设定形状,可以在selector,layout等里面使用,有6个子标签,各属性如下: <?xml version="1.0" encoding="ut ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- keycode
<script type="text/javascript" language=JavaScript charset="UTF-8"> docume ...