This repository contains the project I created whist using Swift (with SwiftUI) and Metal to create simple 3D graphics on Apple platforms. It's part of an ongoing article series in which I explore the fundamentals needed to create a 3D Rendering Pipeline in Swift.
Author’s Note: If I've made any errors, or you have a really cool way of implementing something, feel free to open an issue or leave a comment!
- Articles in This Series
- Useful Resources
- Setup & Requirements
- Feedback & Contributions
- License
- Beautiful Pictures (Development Screenshots)
Below are links to articles detailing each phase of the development process:
Bonus Article: Running Modern OpenGL on macOS: A Virtualized Ubuntu Approach
- Swift x Metal for 3D Graphics Rendering Part 1: Setting Up in SwiftUI
- Swift x Metal for 3D Graphics Rendering Part 2: Metal Shaders and Drawing A Triangle
- Swift x Metal for 3D Graphics Rendering Part 3: Vertex and Index Buffers
- Swift x Metal for 3D Graphics Rendering Part 4: Drawing 3D Shapes And The Matrix
- Swift x Metal for 3D Graphics Rendering Part 5: Drawing 3D Models From Files
- Coming One of These Days: Part 6 and More
Check back periodically or watch this repo to see when new articles are added!
- @GetIntoGameDev’s YouTube Channel
- Kodeco’s (Ray Wenderlich) Metal Courses (Paid)
- Old but FREE Kodeco Course on YouTube
- Apple’s Metal Documentation
- Metal by Tutorials book Source Code
-
Xcode
-
iOS or macOS Catalyst deployment target (my code assumes macOS Catalyst, but it can be adapted).
-
Swift 5.7 or later.
-
Clone the repository
-
Open project in XCode
-
Change the Development Team
-
Clean your build folder
-
Build and run the app
- Found a bug or have a suggestion? Open an issue or submit a pull request.
- Have a unique approach or optimization? Feel free to share by opening a PR or starting a discussion.
- Curious about a specific topic in Metal? Let me know, and I might write a dedicated article about it!
This project is available under the MIT License. Feel free to use, modify, and distribute this code for your own projects.
Screen.Recording.2025-01-27.at.3.00.33.PM.mov
![Screenshot 2025-01-27 at 2 07 35 PM](https://private-user-images.githubusercontent.com/53784701/407082487-f5e82707-2b9d-46e6-88b0-025bbaa7ca2b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzMTg4ODQsIm5iZiI6MTczOTMxODU4NCwicGF0aCI6Ii81Mzc4NDcwMS80MDcwODI0ODctZjVlODI3MDctMmI5ZC00NmU2LTg4YjAtMDI1YmJhYTdjYTJiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDAwMDMwNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlhOTJmNDAxYjY0Njk2MWJhMDg3ZTU5M2FkMGVhZGJmZTQ4MjgxOTFkOGE4YTM4NjY1ZThlNTM3MTI2NTkxNzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.RnulNTfx_TIovZ_cJoL2xBE_oV8BiVSPpwnk_zR0zjU)
![Screenshot 2025-01-12 at 4 42 51 PM](https://private-user-images.githubusercontent.com/53784701/402371775-f8b307f8-65f7-4601-8d36-4e2827621b83.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzMTg4ODQsIm5iZiI6MTczOTMxODU4NCwicGF0aCI6Ii81Mzc4NDcwMS80MDIzNzE3NzUtZjhiMzA3ZjgtNjVmNy00NjAxLThkMzYtNGUyODI3NjIxYjgzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDAwMDMwNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBiODNjOGUwZDcwZDJkOTRhY2I1MDdkYWNjYTgzOTU5YmFjZjFkZmY2NmUyMzdjZTYxY2E2MDhhYjBlYTI0YWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.-iH1ENbJu3mdFwJ4uNaPgHo--wX_B80lE0lFyBubnvc)
![Screenshot 2025-01-12 at 4 46 01 PM](https://private-user-images.githubusercontent.com/53784701/402371943-891b84aa-af09-4d3e-b612-aa8cd737e136.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzMTg4ODQsIm5iZiI6MTczOTMxODU4NCwicGF0aCI6Ii81Mzc4NDcwMS80MDIzNzE5NDMtODkxYjg0YWEtYWYwOS00ZDNlLWI2MTItYWE4Y2Q3MzdlMTM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDAwMDMwNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU5Y2E5ZDJkMmNhYzQxM2ViYjc2MzI0Y2ZiNDliYTQzOTA1N2FjNGNiYjEyNDQ4MDhkMTE3NjQyMzhlMTMzOTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.EoNo_4ZOEbrgd2M11YiNbYgrkexMQZDG1TmjryUPFuk)
![Screenshot 2025-01-07 at 3 14 32 PM](https://private-user-images.githubusercontent.com/53784701/400816661-7f8f362e-f96a-46a1-925b-47940cca9364.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkzMTg4ODQsIm5iZiI6MTczOTMxODU4NCwicGF0aCI6Ii81Mzc4NDcwMS80MDA4MTY2NjEtN2Y4ZjM2MmUtZjk2YS00NmExLTkyNWItNDc5NDBjY2E5MzY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEyVDAwMDMwNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc4ZjBkYmEzZDIyZGE2MDFjZDY3MmIzMGVmMjY3NWRhNWJiNDU2M2U2Mjg3MjM2OWEzNTZmNDI4ZGE4YjM4YmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lszKQLGOj4FJcIAiKTw0DghuatE6xU-onVGKcb34isY)