index.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. <!DOCTYPE html>
  2. <html lang="en-us">
  3. <head>
  4. <title>jMonkeyEngine | Features</title>
  5. <meta name="viewport" content="width=device-width,minimum-scale=1">
  6. <meta name="description"
  7. content="jMonkeyEngine is a modern developer friendly game engine written primarily in Java. ">
  8. <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
  9. <link rel="stylesheet" href="/css/style.css">
  10. <meta name="twitter:card" content="summary"/>
  11. <meta name="twitter:title" content="Features"/>
  12. <meta name="twitter:description" content="jMonkeyEngine is a feature-rich engine capabale of creating both beautiful
  13. and complex games, single-player or networked, on a wide variety of platforms.
  14. Platforms Windows Linux Mac OSX Raspberry Pi 3 (OpenGL ES 2.0) Raspberry Pi 4 (OpenGL ES 3.2) Android Supported Model Formats GLTF OBJ Audio Support for WAV, MP3 and OGG file formats. Buffered and Streaming support. Global, directional and positional sounds."/>
  15. <meta property="og:title" content="Features" />
  16. <meta property="og:description" content="jMonkeyEngine is a feature-rich engine capabale of creating both beautiful
  17. and complex games, single-player or networked, on a wide variety of platforms.
  18. Platforms Windows Linux Mac OSX Raspberry Pi 3 (OpenGL ES 2.0) Raspberry Pi 4 (OpenGL ES 3.2) Android Supported Model Formats GLTF OBJ Audio Support for WAV, MP3 and OGG file formats. Buffered and Streaming support. Global, directional and positional sounds." />
  19. <meta property="og:type" content="article" />
  20. <meta property="og:url" content="https://jmonkeyengine.org/features/" /><meta property="article:section" content="" />
  21. <meta itemprop="name" content="Features">
  22. <meta itemprop="description" content="jMonkeyEngine is a feature-rich engine capabale of creating both beautiful
  23. and complex games, single-player or networked, on a wide variety of platforms.
  24. Platforms Windows Linux Mac OSX Raspberry Pi 3 (OpenGL ES 2.0) Raspberry Pi 4 (OpenGL ES 3.2) Android Supported Model Formats GLTF OBJ Audio Support for WAV, MP3 and OGG file formats. Buffered and Streaming support. Global, directional and positional sounds.">
  25. <meta itemprop="wordCount" content="359">
  26. <meta itemprop="keywords" content="" />
  27. <script src="/js/old-browser.js"></script>
  28. <link rel="stylesheet" href="/css/old-browser.css">
  29. <script src="/highlight/highlight.pack.js"></script>
  30. <script
  31. src="//cdnjs.cloudflare.com/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>
  32. <link rel="stylesheet" href="/highlight/styles/railscasts.css">
  33. <script type="text/javascript">
  34. hljs.initHighlightingOnLoad();
  35. hljs.initLineNumbersOnLoad();
  36. </script>
  37. <script src="/js/utils.js"></script>
  38. <script src="/js/showcase.js"></script>
  39. <script type="module" src="/js/Main.js"></script>
  40. <script src="https://cdnjs.cloudflare.com/ajax/libs/later/1.2.0/later.min.js" integrity="sha512-4OyNDMl5KLKjS8F1ImVwUvmthM8HkXbR6vMafCmT5zBTd9I/sA3z3zM0JLBosHW6/3K2jq2RoBo/eTUNS2hOGA==" crossorigin="anonymous"></script>
  41. <script src="/js/maintenance/maintenance.js"></script>
  42. <link rel="stylesheet" href="/js/maintenance/maintenance.css">
  43. <script src="/js/christmas/Christmas.js"></script>
  44. <script>
  45. Christmas.init(
  46. "https://jmonkeyengine.org/js/christmas/",
  47. ["figure.githubUser img", 'img.avatar', "#showcase button"],
  48. [
  49. {
  50. type: "attribute",
  51. value: "src",
  52. transform:function(src){
  53. if(src.startsWith("/user_avatar/hub.jmonkeyengine.org/")) {
  54. return src.substring("/user_avatar/hub.jmonkeyengine.org/".length).split("/")[0];
  55. }
  56. return src;
  57. }
  58. },
  59. {
  60. type: "attribute",
  61. value: "title"
  62. },
  63. {
  64. type: "text"
  65. }
  66. ],
  67. ["header img.avatar"]
  68. );
  69. </script>
  70. </head>
  71. <body>
  72. <header> <nav class="responsiveWidth " id="topmenu">
  73. <div class="expandable">
  74. <a href="https://jmonkeyengine.org/" alt-href="https://jmonkeyengine.org/tags,https://jmonkeyengine.org/authors,https://jmonkeyengine.org/devlog,https://jmonkeyengine.org/blog,,https://jmonkeyengine.org/communitylog">
  75. <button class="genericCl responsiveIcon expandable ">
  76. <i class="fas fa-home"></i> <span>Home</span>
  77. </button>
  78. </a>
  79. <a href="https://jmonkeyengine.org/tags/showcase" alt-href="https://jmonkeyengine.org/showcase">
  80. <button class="genericCl responsiveIcon expandable ">
  81. <i class="fas fa-images"></i> <span>Showcase</span>
  82. </button>
  83. </a>
  84. <a href="https://hub.jmonkeyengine.org">
  85. <button class="genericCl responsiveIcon expandable ">
  86. <i class="fab fa-discourse"></i> <span>Discussions</span>
  87. </button>
  88. </a>
  89. <a href="https://library.jmonkeyengine.org" >
  90. <button class="genericCl responsiveIcon expandable ">
  91. <i class="fas fa-puzzle-piece"></i> <span>Library</span>
  92. </button>
  93. </a>
  94. <a href="https://jmonkeyengine.org/docs">
  95. <button class="genericCl responsiveIcon expandable ">
  96. <i class="fas fa-book"></i> <span>Docs</span>
  97. </button>
  98. </a>
  99. <a href="https://jmonkeyengine.org/license">
  100. <button class="genericCl responsiveIcon expandable toggleable toggledOffPortrait">
  101. <i class="fas fa-balance-scale-right"></i> <span>License</span>
  102. </button>
  103. </a>
  104. </div>
  105. <div class="toggleable toggledOffPortrait expandable">
  106. <a href="https://github.com/jMonkeyEngine/jmonkeyengine" rel='noopener noreferrer' target="_blank">
  107. <button class="icon toggleable toggledOffPortrait codeCl expandable " title="Github">
  108. <i class="fab fa-github-square"></i> <span>Github</span>
  109. </button>
  110. </a>
  111. <a href="https://twitter.com/jmonkeyengine" rel='noopener noreferrer' target="_blank">
  112. <button class="icon twitterCl toggleable toggledOffPortrait expandable " title="Follow on Twitter">
  113. <i class="fab fa-twitter"></i> <span>Twitter</span>
  114. </button>
  115. </a>
  116. <a href="https://www.youtube.com/channel/UC-Fs3R5Q6wW_XYspOXGZgPw" rel='noopener noreferrer'
  117. target="_blank">
  118. <button class="icon youtubeCl toggleable toggledOffPortrait expandable " title="Follow on Youtube">
  119. <i class="fab fa-youtube"></i> <span>Youtube</span>
  120. </button>
  121. </a>
  122. <a href="https://discord.gg/Rv8sfVu" rel='noopener noreferrer' target="_blank">
  123. <button class="icon discordCl toggleable toggledOffPortrait expandable " title="Discord">
  124. <i class="fab fa-discord"></i> <span>Discord</span>
  125. </button>
  126. </a>
  127. <a href="https://jmonkeyengine.org/donate" >
  128. <button class="icon donateCl toggleable toggledOffPortrait expandable " title="Donate">
  129. <i class="fas fa-donate"></i> <span>Donate!</span>
  130. </button>
  131. </a>
  132. </div>
  133. </nav>
  134. <script>
  135. !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.stringSimilarity=e():t.stringSimilarity=e()}(self,(function(){return t={138:t=>{function e(t,e){if((t=t.replace(/\s+/g,""))===(e=e.replace(/\s+/g,"")))return 1;if(t.length<2||e.length<2)return 0;let r=new Map;for(let e=0;e<t.length-1;e++){const n=t.substring(e,e+2),o=r.has(n)?r.get(n)+1:1;r.set(n,o)}let n=0;for(let t=0;t<e.length-1;t++){const o=e.substring(t,t+2),s=r.has(o)?r.get(o):0;s>0&&(r.set(o,s-1),n++)}return 2*n/(t.length+e.length-2)}t.exports={compareTwoStrings:e,findBestMatch:function(t,r){if(!function(t,e){return"string"==typeof t&&!!Array.isArray(e)&&!!e.length&&!e.find((function(t){return"string"!=typeof t}))}(t,r))throw new Error("Bad arguments: First argument should be a string, second should be an array of strings");const n=[];let o=0;for(let s=0;s<r.length;s++){const i=r[s],f=e(t,i);n.push({target:i,rating:f}),f>n[o].rating&&(o=s)}return{ratings:n,bestMatch:n[o],bestMatchIndex:o}}}}},e={},function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{}};return t[n](o,o.exports,r),o.exports}(138);var t,e}));
  136. window.initJmeMenu=function () {
  137. const selectionClass= window.selectedTopMenuClass || "highlightedCl";
  138. const topmenu = document.querySelector('#topmenu');
  139. if (window.location.href.startsWith("http://localhost:1313")) {
  140. for (const a of topmenu.querySelectorAll("a")) {
  141. a.href = a.href.replace("https://jmonkeyengine.org", "http://localhost:1313");
  142. }
  143. }
  144. const likelyScore=[];
  145. for (const a of topmenu.querySelectorAll("a")) {
  146. const pageUrl=window.location.href.endsWith("/")?window.location.href.substring(0,window.location.href.length-1):window.location.href;
  147. const process = (linkUrls) => {
  148. if(!linkUrls)return;
  149. for(let linkUrl of linkUrls){
  150. if (linkUrl != null) {
  151. if (window.location.href.startsWith("http://localhost:1313")) {
  152. linkUrl = linkUrl.replace("https://jmonkeyengine.org", "http://localhost:1313");
  153. }
  154. if (linkUrl.endsWith("/")) {
  155. linkUrl = linkUrl.substring(0, linkUrl.length - 1);
  156. }
  157. const score = stringSimilarity.compareTwoStrings(linkUrl, pageUrl);
  158. likelyScore.push(
  159. {
  160. score: score,
  161. el: a.querySelector("button")
  162. }
  163. );
  164. }
  165. }
  166. }
  167. process([a.href]);
  168. process(a.getAttribute("alt-href")?a.getAttribute("alt-href").split(","):undefined);
  169. }
  170. likelyScore.sort((a, b) => b.score - a.score);
  171. likelyScore.forEach(el=>el.el.classList.remove(selectionClass));
  172. likelyScore[0].el.classList.add(selectionClass);
  173. };
  174. document.addEventListener('DOMContentLoaded', function(){
  175. window.initJmeMenu();
  176. });
  177. </script>
  178. <div id="siteTitle" class="list hlist responsiveWidth">
  179. <div id="logo">
  180. <a href="/">
  181. <img src="/images/jme-logo.png" />
  182. </a>
  183. <i class="toggleNavOnPortraitButton fas fa-bars" toggle="topmenu"></i>
  184. </div>
  185. <div id="contributionsBanner">
  186. <div> <i class="fas fa-donate"></i>
  187. Backed by:
  188. <a rel='noopener nofollow noreferrer' target="_blank" id="backerName">The Community</a>
  189. <a rel='noopener nofollow noreferrer' target="_blank"
  190. href="https://opencollective.com/jmonkeyengine#section-contributors"> and more...</a>
  191. </div>
  192. <div>
  193. <i class="fab fa-github-alt"></i>
  194. Contributed by:
  195. <a rel='noopener nofollow noreferrer' target="_blank" id="contributorName">The Community</a>
  196. <a rel='noopener nofollow noreferrer' target="_blank"
  197. href="https://github.com/jMonkeyEngine/jmonkeyengine/graphs/contributors">and more...</a>
  198. </div>
  199. </div>
  200. </div>
  201. </header>
  202. <main>
  203. <section id="showcase" mode="banner">
  204. <i id="playButton" class=" fas fa-play"></i>
  205. <div class="showcaseElement" style='display: block '>
  206. <div class="cover blur" style ="background-image: url('/images/showcase/depthris/4.webp'); " ></div>
  207. <div class="cover" style ="background-image: url('/images/showcase/depthris/4.webp'); " ></div>
  208. </div>
  209. <div class="showcaseElement" style='display: none '>
  210. <div class="cover blur" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/1.webp'); " ></div>
  211. <div class="cover" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/1.webp'); " ></div>
  212. </div>
  213. <div class="showcaseElement" style='display: none '>
  214. <div class="cover blur" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/5.webp'); " ></div>
  215. <div class="cover" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/5.webp'); " ></div>
  216. </div>
  217. <div class="showcaseElement" style='display: none '>
  218. <div class="cover blur" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/3.webp'); " ></div>
  219. <div class="cover" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/3.webp'); " ></div>
  220. </div>
  221. <div class="showcaseElement" style='display: none '>
  222. <div class="cover blur" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/2.webp'); " ></div>
  223. <div class="cover" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/2.webp'); " ></div>
  224. </div>
  225. <div class="showcaseElement" style='display: none '>
  226. <div class="cover blur" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/6.webp'); " ></div>
  227. <div class="cover" lazy="true" lazy-style ="background-image: url('/images/showcase/depthris/6.webp'); " ></div>
  228. </div>
  229. <div class="responsiveWidth" id="engineDescription">
  230. jMonkeyEngine is a modern developer friendly game engine written primarily in Java.
  231. <br />
  232. Its minimalistic and code first approach makes it perfect for developers who want the support of a game engine
  233. while retaining full control over their code with the ability to extend and adapt the engine to their workflow.
  234. <br />
  235. <br />
  236. <br />
  237. <a href="/start/"><button id="startbtn" class="highlightedCl" ><i class="fas fa-rocket"></i> Get Started </button></a>
  238. <a href="/#features" title="overview"><button id="startbtn" class="highlightedCl"><i class="fas fa-question-circle" style="padding:0"></i></button></a>
  239. <br />
  240. <br />
  241. </div>
  242. <div class="responsiveWidth" >
  243. <div id="gameDescription" >
  244. <h2><i class="far fa-images" ></i> DEPTHRIS powered by jMonkeyEngine</h2>
  245. 3D puzzle game inspired by the classic title for DOS.
  246. Move and rotate the pieces so they fit in the spaces and fill as much floors as possibles.
  247. But on each level, the pieces will start falling …
  248. <br />
  249. <a class="readMore" href="/showcase/depthris/#showcase">See game page </a>
  250. </div>
  251. </div>
  252. </section>
  253. <br/>
  254. <section class="message list vlist">
  255. <div>
  256. <blockquote class="list vlist responsive">
  257. <span id="backerMessage">-</span>
  258. <i><a rel='noopener nofollow noreferrer' target="_blank" id="backerMessageName">-</a> </i>
  259. </blockquote>
  260. <a href="https://opencollective.com/jmonkeyengine">Become a
  261. backer and leave a message...</a>
  262. </div>
  263. </section>
  264. <br/>
  265. <a id="content"></a>
  266. <section class="full responsiveWidth">
  267. <article>
  268. <h1 >
  269. <i class="fas fa-paragraph useless"></i>
  270. <a href="/features/">Features</a></h1>
  271. <div class="content">
  272. <span>
  273. <p>jMonkeyEngine is a feature-rich engine capabale of creating both beautiful<br>
  274. and complex games, single-player or networked, on a wide variety of platforms.</p>
  275. <hr>
  276. <h3 id="platforms">Platforms</h3>
  277. <ul>
  278. <li>Windows</li>
  279. <li>Linux</li>
  280. <li>Mac OSX</li>
  281. <li>Raspberry Pi 3 (OpenGL ES 2.0)</li>
  282. <li>Raspberry Pi 4 (OpenGL ES 3.2)</li>
  283. <li>Android</li>
  284. </ul>
  285. <h2 id="supported-model-formats">Supported Model Formats</h2>
  286. <ul>
  287. <li>GLTF</li>
  288. <li>OBJ</li>
  289. </ul>
  290. <h3 id="audio">Audio</h3>
  291. <ul>
  292. <li>Support for WAV, MP3 and OGG file formats.</li>
  293. <li>Buffered and Streaming support.</li>
  294. <li>Global, directional and positional sounds.</li>
  295. </ul>
  296. <h3 id="input">Input</h3>
  297. <ul>
  298. <li>Mouse and Keyboard</li>
  299. <li>Touchscreen</li>
  300. <li>Joystick/Joypad/Wheel</li>
  301. </ul>
  302. <h3 id="scenegraph">SceneGraph</h3>
  303. <ul>
  304. <li>Batching</li>
  305. <li>Instancing</li>
  306. <li>2D and 3D scene support</li>
  307. <li>Level of Detail</li>
  308. <li>Light Culling</li>
  309. <li>Single Pass Lighting</li>
  310. </ul>
  311. <h3 id="animation">Animation</h3>
  312. <ul>
  313. <li>Tween API with out of the box support for spatial, bone and morph animations</li>
  314. <li>Stock Tweens availble:
  315. <ul>
  316. <li>Sequence tween: a tween that plays tweens in sequence.</li>
  317. <li>Parallel tween: a tween that plays tweens in parallel.</li>
  318. <li>Delay tween : a tween that just waits…</li>
  319. <li>Stretch tween: a tween that wraps another tween and change its duration.</li>
  320. <li>Camera tween: moves the camera…</li>
  321. <li>CallMethod: calling a method on an object …</li>
  322. </ul>
  323. </li>
  324. <li>Animation Blending</li>
  325. <li>Animation interpolation (interpolors for rotation, position, scale and time)</li>
  326. <li>Hardware Skinning</li>
  327. </ul>
  328. <h3 id="graphics">Graphics</h3>
  329. <ul>
  330. <li>OpenGL support up to OpenGL 4.5</li>
  331. <li>OpenGL ES support up to 3.0</li>
  332. <li>LWJGL2 and 3</li>
  333. <li>Post Processing</li>
  334. <li>Stock Post Processors
  335. <ul>
  336. <li>Water</li>
  337. <li>Screen Space Ambient Occlusion
  338. <ul>
  339. <li>Supports Approximate Normals (50% faster)</li>
  340. </ul>
  341. </li>
  342. <li>Bloom</li>
  343. <li>Cartoon Edge</li>
  344. <li>Color Overlay</li>
  345. <li>Cross-Hatch</li>
  346. <li>Depth Of Field</li>
  347. <li>Fast Approximate Anti Aliasing</li>
  348. <li>Fog</li>
  349. <li>Light Scattering</li>
  350. <li>Posterization</li>
  351. <li>Radial Blur</li>
  352. <li>ToneMap</li>
  353. </ul>
  354. </li>
  355. <li>Unshaded Materials</li>
  356. <li>Phong Lighting Materials</li>
  357. <li>PBR Materials
  358. <ul>
  359. <li>Sphere and OrientedBox Probe areas</li>
  360. <li>Light Probe blending (up to 3 light probes)</li>
  361. <li>Supports both Roughness/Metallic &amp; Roughness/SpecularGloss workflow</li>
  362. </ul>
  363. </li>
  364. <li>Vertex, Fragment and Geometry shader support</li>
  365. <li>Texture Atlas support</li>
  366. <li>Particles</li>
  367. </ul>
  368. <h3 id="language">Language</h3>
  369. <ul>
  370. <li>Support for Java 1.8+</li>
  371. <li>Use Kotlin, Groovy or any combination all in one project.</li>
  372. </ul>
  373. <h3 id="physics">Physics</h3>
  374. <ul>
  375. <li>Bullet Physics</li>
  376. <li><strong><a href="https://github.com/stephengold/Minie">Minie Physics</a></strong> - A high-powered improved and up-to-date binding around Bullet with &ldquo;soft body&rdquo; support.</li>
  377. </ul>
  378. <h3 id="networking">Networking</h3>
  379. <ul>
  380. <li>Networking API supporting UDP/TCP either with low-level Messaging or high-level RMI.</li>
  381. <li><strong><a href="https://github.com/Simsilica/SimEthereal">SimEthereal</a></strong> - A high performance library for real-time networked object synching</li>
  382. </ul>
  383. <h3 id="gui">GUI</h3>
  384. <ul>
  385. <li><strong><a href="http://jmonkeyengine-contributions.github.io/Lemur/">Lemur</a></strong> - a fast and efficient Jme-Native 2D and 3D GUI Toolkit.</li>
  386. <li><strong><a href="https://github.com/jayfella/jme-jfx-11">JME-JFX-11</a></strong> - A bridge to create a 2D GUI in JME using JavaFX 11.</li>
  387. </ul>
  388. <h3 id="entity-system">Entity System</h3>
  389. <ul>
  390. <li><strong><a href="https://github.com/jMonkeyEngine-Contributions/zay-es">Zay-ES</a></strong> - A high-performance entity-component-system</li>
  391. </ul>
  392. <h3 id="profiling">Profiling</h3>
  393. <ul>
  394. <li>DetailedProfiler - Displays timing information for various areas of your game to determine bottlenecks</li>
  395. </ul>
  396. </span>
  397. </div>
  398. </article>
  399. </section>
  400. </main>
  401. <footer>
  402. © 2020 jMonkeyEngine.
  403. All other trademarks, logos and featured content are property of their respective owners.
  404. <br />
  405. <a title="Github repo" rel='noopener nofollow noreferrer' target="_blank"
  406. href="https://github.com/jMonkeyEngine/jmonkeyengine-website">
  407. <i class="fab fa-github"></i> Source on Github
  408. </a>
  409. |
  410. <a title="Report issue" rel='noopener nofollow noreferrer' target="_blank"
  411. href="https://github.com/jMonkeyEngine/jmonkeyengine-website/issues">
  412. <i class="fas fa-bug"></i> Report an issue
  413. </a>
  414. <br />
  415. <br />
  416. Website designed and developed by
  417. <a href="https://github.com/riccardobl">Riccardo Balbo</a>
  418. for the jMonkeyEngine's Community.
  419. </footer>
  420. <div id="poweredBy" >
  421. <a rel='noopener nofollow noreferrer' target="_blank" href="https://www.macstadium.com/">
  422. <img src="/images/macstadium-logo.png" />
  423. </a>
  424. <a rel='noopener nofollow noreferrer' target="_blank" href="https://www.java.com/">
  425. <img src="/images/java-logo.png" />
  426. </a>
  427. <a rel='noopener nofollow noreferrer' target="_blank" href="https://opengl.org/">
  428. <img src="/images/opengl-logo.png" />
  429. </a>
  430. </div>
  431. </body>
  432. </html>