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:

 

comments powered by Disqus

大概步骤

在终端完成

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的更多相关文章

  1. Vysor破解助手for Linux and macOS

    <Vysor Pro破解助手>提供了Windows下的Vysor破解工具,为了使用Linux及macOS同学的方便,最近整理了Linux及macOS版的Vysor破解助手. Linux版V ...

  2. Vmware中Linux或macOS客户端如何回收硬盘空间

    Vmware对于Windows的客户端,使用GUI操作硬盘回收和整理磁盘即可.对于Linux或macOS客户端,需要在安装Vmware Tools之后,在客户端OS的终端Terminal里输入命令进行 ...

  3. MAVLink Linux/QNX/MacOs Integration Tutorial (UDP)

    MAVLink Linux/QNX/MacOs Integration Tutorial (UDP) Overview This program was written to test the udp ...

  4. 深蓝词库转换2.5发布——支持微软五笔,支持Linux和macOS和更多命令行功能

    最近利用晚上的时间,对很久没有新版本发布的深蓝词库转换进行了版本升级.本次升级主要包含的功能包括: 一.支持Win10自带的微软五笔输入法用户自定义短语的导入导出. 1.在转换输入法词库列表中选择“W ...

  5. [Linux实践] macOS平台Homebrew更新brew update卡死,完美解决

    [Linux实践] macOS 平台 Homebrew 更新 brew update 卡死,完美解决 版本2020.01.05 摘要: 使用brew install [软件包]安装软件包时,卡在Upd ...

  6. OpenGL开发学习指南二(glfw+glad)

    版权声明:本文为博主原创文章,未经博主允许不得转载.blog.liujunliang.com.cn https://blog.csdn.net/qq_33747722/article/details/ ...

  7. 在Mac 上搭建Linux虚拟机--MacOS & VMware10 & CentOS 7

    在大型项目开发中, 需要使用Linux下的C语言对工程进行开发, 在个人PC或者工作站上搭建Linux系统十分容易且方便. 本篇文章将介绍操作系统和虚拟机的搭建: 1 操作系统2 虚拟机概念3 Lin ...

  8. 三类安装VMTools失败的解决方法(Windows、Linux、MacOs)

    前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...

  9. 安装VMTools失败的三类解决方法(Windows、Linux、MacOs)

    前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...

随机推荐

  1. 【转载】在HTML中插入swf文件(转)

    在HTML中插入swf文件(转) 在网页里面插入swf,再平常不过了,一般会想到如下代码: Html代码 <object classid="clsid:D27CDB6E-AE6D-11 ...

  2. FFmpeg介绍

    ---恢复内容开始--- FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常 ...

  3. ubuntu下设置数据库字符集

    就linux环境下出现的数据库乱码的问题,以ubuntu为例进行的总结 ubuntu环境设置的字符集utf8,windows默认字符集是GBK,Ubuntu的默认字符集为utf-8,这使 得在用tel ...

  4. 手把手教你玩转nginx负载均衡(三)----配置虚拟服务器网络

    引言 虽然上一篇我们成功的启动了虚拟机,也安装好了操作系统,但是这台虚拟机和主机以及其他虚拟机是没有办法连通的,我们的目标是配置多台服务器并且配置nginx反向代理,来实现负载均衡,所以不能访问内网是 ...

  5. LeetCode 206 Reverse a singly linked list.

    Reverse a singly linked list. Hint: A linked list can be reversed either iteratively or recursively. ...

  6. [项目]WebService涉及到的部分核心代码

     前言: 博客园似乎不太喜欢设计模式的东西,一连写了几篇设计模式的东西,都没什么人气,也许是写的水平有些不够,另外设计模式属于内功,怎们都得修炼一下,否则,设计混乱,不成体系,对于大型项目来说,就会显 ...

  7. C++ 系列:C++ 基础 002

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  8. 安装opensuse时遇到的一些问题

    1.硬盘安装suse的时候提示找不到源,因为是2块硬盘所以需要mount一下硬盘. 2.安装N卡驱动的时候,推荐一键安装,不然需要把所有GCC和make安装好,并且禁用系统的nouneau.

  9. windows和linux平台下的通用时间测试函数

    Time.cpp ////////////////////////////////////////////////////////////////////////////// // Timer.cpp ...

  10. 用 CallerMemberName Attribute 和 EqualityComparer 统一处理类的属性值变化

    当需要实现类似 INotifyPropertyChanged 这样的接口的时候,每一个属性去判断值是否变化,然后触发事件什么的,太麻烦了,如果能用一个方法统一处理就好了. 好在真的可以做到.这个博文说 ...