{"id":1320,"date":"2022-01-07T01:30:00","date_gmt":"2022-01-07T01:30:00","guid":{"rendered":"https:\/\/writingagame.com\/?p=1320"},"modified":"2026-04-09T17:05:26","modified_gmt":"2026-04-09T17:05:26","slug":"opengl-es-vs-vulkan-vs-angle","status":"publish","type":"post","link":"https:\/\/writingagame.com\/index.php\/2022\/01\/07\/opengl-es-vs-vulkan-vs-angle\/","title":{"rendered":"OpenGL ES vs Vulkan vs Angle"},"content":{"rendered":"\n<p><strong>Tags:<\/strong> <em>OpenGL ES, Vulkan, ANGLE, Metal, Cross-Platform Development, Graphics API, Software Architecture, Portability, WebGL, Game Engine Design<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>I\u2019ll admit, I had my doubts about my initial choice of OpenGL ES:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Is it truly as cross-platform as I hope? <\/li>\n\n\n\n<li>Should I have chosen Vulkan instead? <\/li>\n\n\n\n<li>Am I ready to sacrifice Apple\u2019s ecosystem for the sake of this decision?<\/li>\n<\/ul>\n\n\n\n<p>After digging deeper, I finally have some answers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/writingagame.com\/img\/b03\/c03\/01.jpg\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vulkan: The Powerhouse<\/h2>\n\n\n\n<p>Is it good? In short: yes. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It is incredibly fast, <\/li>\n\n\n\n<li>offers robust multi-core support, <\/li>\n\n\n\n<li>and is deeply hardware-oriented. <\/li>\n<\/ul>\n\n\n\n<p>However, my primary interest is <strong>portability<\/strong>, and that is where Vulkan falters:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hardware Fragmentation:<\/strong> Not all GPUs support it yet.<\/li>\n\n\n\n<li><strong>The Apple Wall:<\/strong> Apple famously dropped support for Vulkan and OpenGL in favor of their proprietary <strong>Metal<\/strong> API.<\/li>\n\n\n\n<li><strong>GPU Specificity:<\/strong> It turns out Vulkan isn&#8217;t even truly cross-GPU! Implementation can vary significantly between AMD and Nvidia, for example.<\/li>\n\n\n\n<li><strong>High Barrier to Entry:<\/strong> It is intended for driver-level programming rather than application development.<\/li>\n<\/ul>\n\n\n\n<p>For my intentions, these drawbacks are enough to exclude it from consideration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/writingagame.com\/img\/b03\/c03\/02.jpg\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OpenGL ES: The Pragmatic Choice<\/h2>\n\n\n\n<p>The landscape for OpenGL ES feels much more reassuring. Here\u2019s why:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ubiquity:<\/strong> It is implemented on almost every modern GPU and available on nearly every platform.<\/li>\n\n\n\n<li><strong>Sufficient Power:<\/strong> It is powerful and fast enough for high-quality 3D without the &#8220;Vulkan tax&#8221;.<\/li>\n\n\n\n<li><strong>The WebGL Factor:<\/strong> Because OpenGL ES is the foundation of <strong>WebGL<\/strong>, it has a massive ally: Google. As the main promoter of WebGL, Google ensures that platforms (including Apple) must maintain a pathway for these calls to work.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/writingagame.com\/img\/b03\/c03\/03.jpg\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ANGLE: The Safety Net<\/h2>\n\n\n\n<p id=\"p-rc_4c877aeef1dd837c-37\">Google\u2019s <strong>ANGLE<\/strong> project (Almost Native Graphics Layer Engine) perfectly illustrates my point. Despite the name, it is not an &#8220;engine&#8221;, but a driver. Its primary purpose is to provide cross-platform WebGL support by acting as a translation layer. It converts OpenGL ES calls into whatever native API is available\u2014including <strong>Metal<\/strong> on Apple devices.<\/p>\n\n\n\n<p>Crucially, this translation is specifically designed for <strong>OpenGL ES only<\/strong>. <\/p>\n\n\n\n<p>Even if Apple eventually removes native OpenGL support, ANGLE will still accept GLES calls and execute them on Metal or whatever comes next.<\/p>\n\n\n\n<p>In fact, almost every modern web browser (Chrome, Edge, Firefox) uses ANGLE to render WebGL. By choosing OpenGL ES 3.2, you are essentially &#8220;piggybacking&#8221; on the same technology that keeps the entire 3D internet running.<\/p>\n\n\n\n<p>BTW, <em>Angle <\/em>can also execute <em>OpenGL ES<\/em> calls on <em>Vulkan <\/em>(when necessary).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>I am grateful that I stuck with OpenGL ES from the beginning. It wasn&#8217;t just a safe choice, it was a <strong>wise<\/strong> one. While I haven&#8217;t tested the Mac and iPhone builds yet, one thing is certain: with or without ANGLE, the code <strong>will<\/strong> work.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p class=\"mb-2\">Tags: OpenGL ES, Vulkan, ANGLE, Metal, Cross-Platform Development, Graphics API, Software Architecture, Portability, WebGL, Game Engine Design I\u2019ll admit, I had my doubts about my initial choice of OpenGL ES: After digging deeper, I finally have some answers. Vulkan: The Powerhouse Is it good? In short: yes. However, my primary interest is portability, and that [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-1320","post","type-post","status-publish","format-standard","hentry","category-side-notes"],"_links":{"self":[{"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/posts\/1320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/comments?post=1320"}],"version-history":[{"count":32,"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/posts\/1320\/revisions"}],"predecessor-version":[{"id":4299,"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/posts\/1320\/revisions\/4299"}],"wp:attachment":[{"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/media?parent=1320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/categories?post=1320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/writingagame.com\/index.php\/wp-json\/wp\/v2\/tags?post=1320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}