{"id":1599,"date":"2025-03-24T08:50:18","date_gmt":"2025-03-23T23:50:18","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1599"},"modified":"2025-03-24T08:50:18","modified_gmt":"2025-03-23T23:50:18","slug":"%e3%80%90%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%e3%80%91opengl%e3%81%a7%e3%81%af%e3%81%98%e3%82%81%e3%82%8b3d%e3%82%b0%e3%83%a9%e3%83%95%e3%82%a3%e3%83%83%e3%82%af%e3%82%b9%e5%85%a5%e9%96%80","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1599","title":{"rendered":"\u3010\u5b8c\u5168\u30ac\u30a4\u30c9\u3011OpenGL\u3067\u306f\u3058\u3081\u308b3D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u5165\u9580 \u301c\u74b0\u5883\u69cb\u7bc9\u304b\u3089\u5b9f\u8df5\u307e\u30677\u3064\u306e\u30b9\u30c6\u30c3\u30d7\u301c"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">OpenGL\u3068\u306f\uff1f\u30e2\u30c0\u30f3\u306a\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">3D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u958b\u767a\u306b\u304a\u3051\u308bOpenGL\u306e\u5f79\u5272\u3068\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-2\">OpenGL\u306e\u6b74\u53f2\u3068\u30e2\u30c0\u30f3OpenGL\u3078\u306e\u9032\u5316<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">DirectX\u3084Vulkan\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">OpenGL\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">Windows\/Mac\/Linux\u3067\u306e\u958b\u767a\u74b0\u5883\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u5fc5\u8981\u306a\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u30c4\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u30c8\u30e9\u30d6\u30eb\u30d5\u30ea\u30fc\u306a\u74b0\u5883\u69cb\u7bc9\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u306f\u3058\u3081\u3066\u306e3D\u63cf\u753b\uff1a\u30b9\u30c6\u30c3\u30d7\u30fb\u30d0\u30a4\u30fb\u30b9\u30c6\u30c3\u30d7\u30ac\u30a4\u30c9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30b9\u30c6\u30c3\u30d71\uff1a\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u4f5c\u6210\u3068OpenGL\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u521d\u671f\u5316<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30b9\u30c6\u30c3\u30d72\uff1a\u57fa\u672c\u56f3\u5f62\u306e\u63cf\u753b\u3068\u5ea7\u6a19\u7cfb\u306e\u7406\u89e3<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u30b9\u30c6\u30c3\u30d73\uff1a\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u57fa\u790e\u3068\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u5b9f\u8df5\u7684\u306aOpenGL\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u6280\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">\u52b9\u7387\u7684\u306a\u30d0\u30c3\u30d5\u30a1\u7ba1\u7406\u3068\u30e1\u30e2\u30ea\u6700\u9069\u5316<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u30c6\u30af\u30b9\u30c1\u30e3\u30de\u30c3\u30d4\u30f3\u30b0\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u5149\u6e90\u3068\u5f71\u306e\u8868\u73fe\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u79d8\u8a23<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u63cf\u753b\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u4e00\u822c\u7684\u306a\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">OpenGL\u306b\u3088\u308b\u5b9f\u8df5\u7684\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u30b7\u30f3\u30d7\u30eb\u306a3D\u30d3\u30e5\u30fc\u30a2\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u306e\u57fa\u790e\u3068\u306a\u308b\u6a5f\u80fd\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-24\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\uff1aOpenGL\u30de\u30b9\u30bf\u30fc\u3078\u306e\u9053<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-25\">\u9ad8\u5ea6\u306a\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u6280\u8853\u306e\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30a2\u30a4\u30c7\u30a2\u3068\u5b9f\u88c5\u306e\u30d2\u30f3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-27\">OpenGL\u306e\u6700\u65b0\u30c8\u30ec\u30f3\u30c9\u3068\u3053\u308c\u304b\u3089\u306e\u5c55\u671b<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">OpenGL\u3068\u306f\uff1f\u30e2\u30c0\u30f3\u306a\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">3D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u958b\u767a\u306b\u304a\u3051\u308bOpenGL\u306e\u5f79\u5272\u3068\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>OpenGL\uff08Open Graphics Library\uff09\u306f\u3001\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u306b\u4f9d\u5b58\u3057\u306a\u30442D\/3D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u63cf\u753b\u306e\u305f\u3081\u306e\u696d\u754c\u6a19\u6e96API\u3067\u3059\u3002\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u5f37\u307f\u3092\u6301\u3061\u3001\u79d1\u5b66\u6280\u8853\u8a08\u7b97\u306e\u53ef\u8996\u5316\u304b\u3089\u30b2\u30fc\u30e0\u958b\u767a\u307e\u3067\u3001\u5e45\u5e83\u3044\u5206\u91ce\u3067\u6d3b\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>OpenGL\u306e\u4e3b\u306a\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30aa\u30fc\u30d7\u30f3\u306a\u4ed5\u69d8\uff1a\u4ed5\u69d8\u304c\u516c\u958b\u3055\u308c\u3066\u304a\u308a\u3001\u8ab0\u3067\u3082\u5229\u7528\u53ef\u80fd<\/li>\n\n\n\n<li>\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u72ec\u7acb\u6027\uff1a\u69d8\u3005\u306a\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u3067\u52d5\u4f5c<\/li>\n\n\n\n<li>\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\uff1a\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u6d3b\u7528<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u30b5\u30dd\u30fc\u30c8\uff1a\u591a\u304f\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3068\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8a00\u8a9e\u3067\u30b5\u30dd\u30fc\u30c8<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">OpenGL\u306e\u6b74\u53f2\u3068\u30e2\u30c0\u30f3OpenGL\u3078\u306e\u9032\u5316<\/h3>\n\n\n\n<p>OpenGL\u306e\u9032\u5316\u306f\u3001\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u6280\u8853\u306e\u767a\u5c55\u3068\u5bc6\u63a5\u306b\u7d50\u3073\u3064\u3044\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<p>1992\u5e74\uff1aOpenGL 1.0\u30ea\u30ea\u30fc\u30b9<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u56fa\u5b9a\u6a5f\u80fd\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/li>\n\n\n\n<li>\u5373\u6642\u30e2\u30fc\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u57fa\u672c\u7684\u306a3D\u63cf\u753b\u6a5f\u80fd<\/li>\n<\/ul>\n\n\n\n<p>2004\u5e74\uff1aOpenGL 2.0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b0\u30e9\u30de\u30d6\u30eb\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u5c0e\u5165<\/li>\n\n\n\n<li>GLSL\uff08OpenGL Shading Language\uff09\u306e\u6a19\u6e96\u5316<\/li>\n\n\n\n<li>\u3088\u308a\u67d4\u8edf\u306a\u63cf\u753b\u5236\u5fa1\u304c\u53ef\u80fd\u306b<\/li>\n<\/ul>\n\n\n\n<p>2008\u5e74\uff1aOpenGL 3.0\u4ee5\u964d<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30ac\u30b7\u30fc\u6a5f\u80fd\u306e\u5ec3\u6b62<\/li>\n\n\n\n<li>\u30e2\u30c0\u30f3\u306a\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u6a5f\u80fd\u306e\u5927\u5e45\u306a\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">DirectX\u3084Vulkan\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>\u4e3b\u8981\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9API\u306e\u6bd4\u8f03\uff1a<\/p>\n\n\n\n<p>DirectX\u3068\u306e\u9055\u3044\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\uff1aOpenGL\u306f\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3001DirectX\u306fWindows\/Xbox\u306b\u7279\u5316<\/li>\n\n\n\n<li>\u5b66\u7fd2\u66f2\u7dda\uff1aOpenGL\u306e\u65b9\u304c\u521d\u5b66\u8005\u306b\u3068\u3063\u3066\u6271\u3044\u3084\u3059\u3044<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\uff1a\u540c\u7a0b\u5ea6\u3060\u304c\u3001DirectX\u306fWindows\u306b\u6700\u9069\u5316\u3055\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<p>Vulkan\u3068\u306e\u9055\u3044\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u62bd\u8c61\u5316\u30ec\u30d9\u30eb\uff1aOpenGL\u306f\u9ad8\u30ec\u30d9\u30eb\u3001Vulkan\u306f\u4f4e\u30ec\u30d9\u30ebAPI<\/li>\n\n\n\n<li>\u5236\u5fa1\u6027\uff1aVulkan\u306f\u3088\u308a\u8a73\u7d30\u306a\u5236\u5fa1\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u958b\u767a\u52b9\u7387\uff1aOpenGL\u306e\u65b9\u304c\u958b\u767a\u901f\u5ea6\u304c\u901f\u3044<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\uff1aVulkan\u306e\u65b9\u304c\u6f5c\u5728\u7684\u306b\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u767a\u63ee\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<p>\u30e2\u30c0\u30f3OpenGL\u3092\u9078\u3076\u7406\u7531\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9\u3068\u30b3\u30df\u30e5\u30cb\u30c6\u30a3<\/li>\n\n\n\n<li>\u9069\u5ea6\u306a\u62bd\u8c61\u5316\u30ec\u30d9\u30eb\u3067\u958b\u767a\u52b9\u7387\u304c\u9ad8\u3044<\/li>\n\n\n\n<li>\u5341\u5206\u306a\u6a5f\u80fd\u3068\u6027\u80fd\u3092\u5099\u3048\u3066\u3044\u308b<\/li>\n\n\n\n<li>\u591a\u304f\u306e\u4f01\u696d\u3067\u63a1\u7528\u5b9f\u7e3e\u304c\u3042\u308b<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">OpenGL\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">Windows\/Mac\/Linux\u3067\u306e\u958b\u767a\u74b0\u5883\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5404OS\u5411\u3051\u306e\u74b0\u5883\u69cb\u7bc9\u624b\u9806\u3092\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>Windows\u74b0\u5883\u306e\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Visual Studio\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visual Studio 2022 Community\u3092\u63a8\u5968<\/li>\n\n\n\n<li>C++\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u958b\u767a\u30ef\u30fc\u30af\u30ed\u30fc\u30c9\u3092\u9078\u629e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>vcpkg\u306b\u3088\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git clone https:\/\/github.com\/Microsoft\/vcpkg.git\ncd vcpkg\n.\/bootstrap-vcpkg.bat\n.\/vcpkg install glfw3:x64-windows\n.\/vcpkg install glad:x64-windows\n.\/vcpkg integrate install<\/pre>\n\n\n\n<p><strong>Mac\u74b0\u5883\u306e\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Homebrew\u3092\u4f7f\u7528\u3057\u305f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/bin\/bash -c \"$(curl -fsSL https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh)\"\nbrew install cmake\nbrew install glfw\nbrew install glad<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Xcode\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08App Store\u304b\u3089\uff09<\/li>\n<\/ol>\n\n\n\n<p><strong>Linux\u74b0\u5883\u306e\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt-get update\nsudo apt-get install build-essential\nsudo apt-get install libglfw3-dev\nsudo apt-get install cmake<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u5fc5\u8981\u306a\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u30c4\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<p>\u4e3b\u8981\u306a\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u8aac\u660e\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>GLFW\uff1a\u30a6\u30a3\u30f3\u30c9\u30a6\u4f5c\u6210\u3068OpenGL\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30a4\u30d9\u30f3\u30c8\u51e6\u7406\u6a5f\u80fd\u4ed8\u304d<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30e2\u30cb\u30bf\u30fc\u30b5\u30dd\u30fc\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>GLAD\uff1aOpenGL\u95a2\u6570\u30ed\u30fc\u30c0\u30fc<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6700\u65b0\u306eOpenGL\u6a5f\u80fd\u3078\u306e\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u9593\u306e\u5dee\u7570\u3092\u5438\u53ce<\/li>\n\n\n\n<li>\u30aa\u30f3\u30e9\u30a4\u30f3\u30b8\u30a7\u30cd\u30ec\u30fc\u30bf\u30fc\u3067\u5fc5\u8981\u306a\u6a5f\u80fd\u3092\u9078\u629e\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>GLM\uff1a\u6570\u5b66\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d9\u30af\u30c8\u30eb\u30fb\u884c\u5217\u6f14\u7b97<\/li>\n\n\n\n<li>OpenGL\u3068\u76f8\u6027\u306e\u826f\u3044\u8a2d\u8a08<\/li>\n\n\n\n<li>GLSL\u4e92\u63db\u306e\u578b\u3068\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30c8\u30e9\u30d6\u30eb\u30d5\u30ea\u30fc\u306a\u74b0\u5883\u69cb\u7bc9\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u6210\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">project_root\/\n  \u251c\u2500\u2500 src\/\n  \u2502   \u251c\u2500\u2500 main.cpp\n  \u2502   \u2514\u2500\u2500 shader\/\n  \u2502       \u251c\u2500\u2500 vertex.glsl\n  \u2502       \u2514\u2500\u2500 fragment.glsl\n  \u251c\u2500\u2500 include\/\n  \u2502   \u2514\u2500\u2500 external\/\n  \u251c\u2500\u2500 lib\/\n  \u2514\u2500\u2500 CMakeLists.txt<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>CMake\u306b\u3088\u308b\u30d3\u30eb\u30c9\u8a2d\u5b9a\u4f8b\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cmake_minimum_required(VERSION 3.10)\nproject(OpenGLProject)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nfind_package(OpenGL REQUIRED)\nfind_package(glfw3 REQUIRED)\n\nadd_executable(${PROJECT_NAME} src\/main.cpp)\ntarget_link_libraries(${PROJECT_NAME} \n    OpenGL::GL\n    glfw\n)<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u52d5\u4f5c\u78ba\u8a8d\u7528\u306e\u6700\u5c0f\u30b3\u30fc\u30c9\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;GLFW\/glfw3.h&gt;\n#include &lt;iostream&gt;\n\nint main() {\n    if (!glfwInit()) {\n        std::cerr &lt;&lt; \"GLFW initialization failed\" &lt;&lt; std::endl;\n        return -1;\n    }\n\n    GLFWwindow* window = glfwCreateWindow(800, 600, \"OpenGL Window\", nullptr, nullptr);\n    if (!window) {\n        std::cerr &lt;&lt; \"Window creation failed\" &lt;&lt; std::endl;\n        glfwTerminate();\n        return -1;\n    }\n\n    glfwMakeContextCurrent(window);\n\n    while (!glfwWindowShouldClose(window)) {\n        glClear(GL_COLOR_BUFFER_BIT);\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    glfwTerminate();\n    return 0;\n}<\/pre>\n\n\n\n<p>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u4e92\u63db\u6027\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30b3\u30f3\u30d1\u30a4\u30e9\u3068\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u4e00\u81f4<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30d3\u30eb\u30c9\u8a2d\u5b9a\u306e\u78ba\u8a8d\uff08\u30ea\u30f3\u30ab\u30fc\u30aa\u30d7\u30b7\u30e7\u30f3\u7b49\uff09<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u306f\u3058\u3081\u3066\u306e3D\u63cf\u753b\uff1a\u30b9\u30c6\u30c3\u30d7\u30fb\u30d0\u30a4\u30fb\u30b9\u30c6\u30c3\u30d7\u30ac\u30a4\u30c9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30b9\u30c6\u30c3\u30d71\uff1a\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u4f5c\u6210\u3068OpenGL\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u521d\u671f\u5316<\/h3>\n\n\n\n<p>\u30e2\u30c0\u30f3\u306aOpenGL\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u57fa\u672c\u3068\u306a\u308b\u30a6\u30a3\u30f3\u30c9\u30a6\u4f5c\u6210\u3068\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u521d\u671f\u5316\u306e\u5b9f\u88c5\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;glad\/glad.h&gt;\n#include &lt;GLFW\/glfw3.h&gt;\n#include &lt;iostream&gt;\n\n\/\/ \u30a6\u30a3\u30f3\u30c9\u30a6\u30b5\u30a4\u30ba\u5909\u66f4\u6642\u306e\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height) {\n    glViewport(0, 0, width, height);\n}\n\n\/\/ \u30a8\u30e9\u30fc\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\nvoid error_callback(int error, const char* description) {\n    std::cerr &lt;&lt; \"Error: \" &lt;&lt; description &lt;&lt; std::endl;\n}\n\nint main() {\n    \/\/ GLFW\u306e\u521d\u671f\u5316\n    if (!glfwInit()) {\n        std::cerr &lt;&lt; \"Failed to initialize GLFW\" &lt;&lt; std::endl;\n        return -1;\n    }\n\n    \/\/ OpenGL\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u6307\u5b9a\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);\n    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n\n    \/\/ \u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u4f5c\u6210\n    GLFWwindow* window = glfwCreateWindow(800, 600, \"OpenGL Tutorial\", NULL, NULL);\n    if (!window) {\n        std::cerr &lt;&lt; \"Failed to create GLFW window\" &lt;&lt; std::endl;\n        glfwTerminate();\n        return -1;\n    }\n\n    \/\/ \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u4f5c\u6210\n    glfwMakeContextCurrent(window);\n\n    \/\/ GLAD\u306e\u521d\u671f\u5316\n    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {\n        std::cerr &lt;&lt; \"Failed to initialize GLAD\" &lt;&lt; std::endl;\n        return -1;\n    }\n\n    \/\/ \u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\u306e\u8a2d\u5b9a\n    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n    glfwSetErrorCallback(error_callback);\n\n    \/\/ \u30e1\u30a4\u30f3\u30eb\u30fc\u30d7\n    while (!glfwWindowShouldClose(window)) {\n        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    glfwTerminate();\n    return 0;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30b9\u30c6\u30c3\u30d72\uff1a\u57fa\u672c\u56f3\u5f62\u306e\u63cf\u753b\u3068\u5ea7\u6a19\u7cfb\u306e\u7406\u89e3<\/h3>\n\n\n\n<p>OpenGL\u306e\u5ea7\u6a19\u7cfb\u3068\u57fa\u672c\u7684\u306a\u56f3\u5f62\u63cf\u753b\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u4e09\u89d2\u5f62\u306e\u9802\u70b9\u30c7\u30fc\u30bf\nfloat vertices[] = {\n    \/\/ \u4f4d\u7f6e\u5ea7\u6a19\n    -0.5f, -0.5f, 0.0f,  \/\/ \u5de6\u4e0b\n     0.5f, -0.5f, 0.0f,  \/\/ \u53f3\u4e0b\n     0.0f,  0.5f, 0.0f   \/\/ \u4e0a\u90e8\n};\n\n\/\/ \u9802\u70b9\u30d0\u30c3\u30d5\u30a1\u3068\u30d0\u30c3\u30d5\u30a1\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u751f\u6210\nunsigned int VBO, VAO;\nglGenVertexArrays(1, &amp;VAO);\nglGenBuffers(1, &amp;VBO);\n\n\/\/ \u30d0\u30c3\u30d5\u30a1\u306e\u30d0\u30a4\u30f3\u30c9\u3068\u30c7\u30fc\u30bf\u306e\u8ee2\u9001\nglBindVertexArray(VAO);\nglBindBuffer(GL_ARRAY_BUFFER, VBO);\nglBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n\/\/ \u9802\u70b9\u5c5e\u6027\u306e\u8a2d\u5b9a\nglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);\nglEnableVertexAttribArray(0);\n\n\/\/ \u63cf\u753b\u30b3\u30fc\u30c9\uff08\u30e1\u30a4\u30f3\u30eb\u30fc\u30d7\u5185\uff09\nglUseProgram(shaderProgram);\nglBindVertexArray(VAO);\nglDrawArrays(GL_TRIANGLES, 0, 3);<\/pre>\n\n\n\n<p>OpenGL\u306e\u5ea7\u6a19\u7cfb\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u53f3\u624b\u5ea7\u6a19\u7cfb\u3092\u63a1\u7528<\/li>\n\n\n\n<li>X\u8ef8\uff1a\u53f3\u304c\u6b63\u65b9\u5411<\/li>\n\n\n\n<li>Y\u8ef8\uff1a\u4e0a\u304c\u6b63\u65b9\u5411<\/li>\n\n\n\n<li>Z\u8ef8\uff1a\u624b\u524d\u304c\u8ca0\u65b9\u5411\uff08\u5965\u304c\u6b63\u65b9\u5411\uff09<\/li>\n\n\n\n<li>\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\uff1a-1.0\u304b\u30891.0\u306e\u7bc4\u56f2<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30b9\u30c6\u30c3\u30d73\uff1a\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u57fa\u790e\u3068\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30e2\u30c0\u30f3OpenGL\u3067\u5fc5\u9808\u3068\u306a\u308b\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u57fa\u672c\u7684\u306a\u5b9f\u88c5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\uff08vertex.glsl\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#version 330 core\nlayout (location = 0) in vec3 aPos;\n\nvoid main() {\n    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n}<\/pre>\n\n\n\n<p>\u30d5\u30e9\u30b0\u30e1\u30f3\u30c8\u30b7\u30a7\u30fc\u30c0\u30fc\uff08fragment.glsl\uff09:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#version 330 core\nout vec4 FragColor;\n\nvoid main() {\n    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n}<\/pre>\n\n\n\n<p>\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u4f7f\u7528\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u95a2\u6570\nunsigned int compileShader(const char* source, GLenum type) {\n    unsigned int shader = glCreateShader(type);\n    glShaderSource(shader, 1, &amp;source, NULL);\n    glCompileShader(shader);\n\n    \/\/ \u30b3\u30f3\u30d1\u30a4\u30eb\u30a8\u30e9\u30fc\u306e\u30c1\u30a7\u30c3\u30af\n    int success;\n    char infoLog[512];\n    glGetShaderiv(shader, GL_COMPILE_STATUS, &amp;success);\n    if (!success) {\n        glGetShaderInfoLog(shader, 512, NULL, infoLog);\n        std::cerr &lt;&lt; \"Shader compilation error: \" &lt;&lt; infoLog &lt;&lt; std::endl;\n    }\n\n    return shader;\n}\n\n\/\/ \u30b7\u30a7\u30fc\u30c0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4f5c\u6210\nunsigned int vertexShader = compileShader(vertexShaderSource, GL_VERTEX_SHADER);\nunsigned int fragmentShader = compileShader(fragmentShaderSource, GL_FRAGMENT_SHADER);\n\nunsigned int shaderProgram = glCreateProgram();\nglAttachShader(shaderProgram, vertexShader);\nglAttachShader(shaderProgram, fragmentShader);\nglLinkProgram(shaderProgram);\n\n\/\/ \u30ea\u30f3\u30af\u30a8\u30e9\u30fc\u306e\u30c1\u30a7\u30c3\u30af\nint success;\nchar infoLog[512];\nglGetProgramiv(shaderProgram, GL_LINK_STATUS, &amp;success);\nif (!success) {\n    glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);\n    std::cerr &lt;&lt; \"Shader program linking error: \" &lt;&lt; infoLog &lt;&lt; std::endl;\n}\n\n\/\/ \u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u524a\u9664\nglDeleteShader(vertexShader);\nglDeleteShader(fragmentShader);<\/pre>\n\n\n\n<p>\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\uff1a\u9802\u70b9\u306e\u4f4d\u7f6e\u3068\u5c5e\u6027\u3092\u51e6\u7406<\/li>\n\n\n\n<li>\u30d5\u30e9\u30b0\u30e1\u30f3\u30c8\u30b7\u30a7\u30fc\u30c0\u30fc\uff1a\u30d4\u30af\u30bb\u30eb\u306e\u8272\u3092\u6c7a\u5b9a<\/li>\n\n\n\n<li>\u30b7\u30a7\u30fc\u30c0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0\uff1a\u4e21\u30b7\u30a7\u30fc\u30c0\u30fc\u3092\u30ea\u30f3\u30af<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\uff1a\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u30ea\u30f3\u30af\u6642\u306e\u30a8\u30e9\u30fc\u51e6\u7406\u304c\u91cd\u8981<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\uff1a\u4e0d\u8981\u306b\u306a\u3063\u305f\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u9069\u5207\u306a\u524a\u9664<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u5b9f\u8df5\u7684\u306aOpenGL\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u6280\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u52b9\u7387\u7684\u306a\u30d0\u30c3\u30d5\u30a1\u7ba1\u7406\u3068\u30e1\u30e2\u30ea\u6700\u9069\u5316<\/h3>\n\n\n\n<p>OpenGL\u3067\u306e\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u7ba1\u7406\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u76f4\u7d50\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30d0\u30c3\u30d5\u30a1\u306e\u7a2e\u985e\u3068\u4f7f\u3044\u5206\u3051\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u9802\u70b9\u30d0\u30c3\u30d5\u30a1\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\uff08VBO\uff09\u306e\u52b9\u7387\u7684\u306a\u4f7f\u7528\nstruct Vertex {\n    glm::vec3 position;\n    glm::vec2 texCoord;\n    glm::vec3 normal;\n};\n\nstd::vector&lt;Vertex&gt; vertices;\n\/\/ ... \u9802\u70b9\u30c7\u30fc\u30bf\u306e\u8a2d\u5b9a\n\n\/\/ \u30d0\u30c3\u30d5\u30a1\u306e\u751f\u6210\u3068\u8a2d\u5b9a\nGLuint vbo;\nglGenBuffers(1, &amp;vbo);\nglBindBuffer(GL_ARRAY_BUFFER, vbo);\nglBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);\n\n\/\/ \u30a4\u30f3\u30bf\u30fc\u30ea\u30fc\u30d6\u914d\u5217\u306e\u8a2d\u5b9a\nglEnableVertexAttribArray(0); \/\/ position\nglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));\nglEnableVertexAttribArray(1); \/\/ texCoord\nglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texCoord));\nglEnableVertexAttribArray(2); \/\/ normal\nglVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, normal));<\/pre>\n\n\n\n<p>\u30e1\u30e2\u30ea\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30d5\u30a1\u306e\u4f7f\u7528\u76ee\u7684\u306b\u5fdc\u3058\u305f\u30d5\u30e9\u30b0\u306e\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GL_STATIC_DRAW: \u5909\u66f4\u3055\u308c\u306a\u3044\u30c7\u30fc\u30bf<\/li>\n\n\n\n<li>GL_DYNAMIC_DRAW: \u983b\u7e41\u306b\u66f4\u65b0\u3055\u308c\u308b\u30c7\u30fc\u30bf<\/li>\n\n\n\n<li>GL_STREAM_DRAW: \u6bce\u30d5\u30ec\u30fc\u30e0\u66f4\u65b0\u3055\u308c\u308b\u30c7\u30fc\u30bf<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30d5\u30a1\u306e\u30b5\u30d6\u30c7\u30fc\u30bf\u66f4\u65b0<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u90e8\u5206\u7684\u306a\u30d0\u30c3\u30d5\u30a1\u66f4\u65b0\nglBufferSubData(GL_ARRAY_BUFFER, offset, size, data);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30c6\u30af\u30b9\u30c1\u30e3\u30de\u30c3\u30d4\u30f3\u30b0\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30c6\u30af\u30b9\u30c1\u30e3\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406\u3068\u9069\u7528\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c6\u30af\u30b9\u30c1\u30e3\u306e\u8aad\u307f\u8fbc\u307f\u3068\u8a2d\u5b9a\nGLuint loadTexture(const char* path) {\n    GLuint textureID;\n    glGenTextures(1, &amp;textureID);\n    glBindTexture(GL_TEXTURE_2D, textureID);\n\n    \/\/ \u30c6\u30af\u30b9\u30c1\u30e3\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u8a2d\u5b9a\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n    \/\/ \u753b\u50cf\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u8ee2\u9001\n    int width, height, nrChannels;\n    unsigned char* data = stbi_load(path, &amp;width, &amp;height, &amp;nrChannels, 0);\n    if (data) {\n        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);\n        glGenerateMipmap(GL_TEXTURE_2D);\n    }\n    stbi_image_free(data);\n\n    return textureID;\n}\n\n\/\/ \u30de\u30eb\u30c1\u30c6\u30af\u30b9\u30c1\u30e3\u306e\u4f7f\u7528\u4f8b\nvoid useMultipleTextures() {\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, texture1);\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, texture2);\n\n    shader.use();\n    shader.setInt(\"texture1\", 0);\n    shader.setInt(\"texture2\", 1);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u5149\u6e90\u3068\u5f71\u306e\u8868\u73fe\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u30ea\u30a2\u30eb\u306a\u5149\u6e90\u3068\u5f71\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d5\u30a9\u30f3\u30b7\u30a7\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u5b9f\u88c5\uff1a<\/li>\n<\/ol>\n\n\n\n<p>\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#version 330 core\nlayout (location = 0) in vec3 aPos;\nlayout (location = 1) in vec3 aNormal;\n\nuniform mat4 model;\nuniform mat4 view;\nuniform mat4 projection;\n\nout vec3 FragPos;\nout vec3 Normal;\n\nvoid main() {\n    FragPos = vec3(model * vec4(aPos, 1.0));\n    Normal = mat3(transpose(inverse(model))) * aNormal;\n    gl_Position = projection * view * vec4(FragPos, 1.0);\n}<\/pre>\n\n\n\n<p>\u30d5\u30e9\u30b0\u30e1\u30f3\u30c8\u30b7\u30a7\u30fc\u30c0\u30fc\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#version 330 core\nout vec4 FragColor;\n\nin vec3 FragPos;\nin vec3 Normal;\n\nuniform vec3 lightPos;\nuniform vec3 viewPos;\nuniform vec3 lightColor;\nuniform vec3 objectColor;\n\nvoid main() {\n    \/\/ \u30a2\u30f3\u30d3\u30a8\u30f3\u30c8\n    float ambientStrength = 0.1;\n    vec3 ambient = ambientStrength * lightColor;\n\n    \/\/ \u30c7\u30a3\u30d5\u30e5\u30fc\u30ba\n    vec3 norm = normalize(Normal);\n    vec3 lightDir = normalize(lightPos - FragPos);\n    float diff = max(dot(norm, lightDir), 0.0);\n    vec3 diffuse = diff * lightColor;\n\n    \/\/ \u30b9\u30da\u30ad\u30e5\u30e9\u30fc\n    float specularStrength = 0.5;\n    vec3 viewDir = normalize(viewPos - FragPos);\n    vec3 reflectDir = reflect(-lightDir, norm);\n    float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);\n    vec3 specular = specularStrength * spec * lightColor;\n\n    vec3 result = (ambient + diffuse + specular) * objectColor;\n    FragColor = vec4(result, 1.0);\n}<\/pre>\n\n\n\n<p>\u5149\u6e90\u3068\u5f71\u306e\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6cd5\u7dda\u306e\u6b63\u898f\u5316\u3068\u5909\u63db\u884c\u5217\u306e\u9069\u5207\u306a\u51e6\u7406<\/li>\n\n\n\n<li>\u30e9\u30a4\u30c6\u30a3\u30f3\u30b0\u30e2\u30c7\u30eb\u306e\u9078\u629e\uff08\u30d5\u30a9\u30f3\u3001\u30d6\u30ea\u30f3\u30fb\u30d5\u30a9\u30f3\u306a\u3069\uff09<\/li>\n\n\n\n<li>\u30b7\u30e3\u30c9\u30a6\u30de\u30c3\u30d4\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u8907\u6570\u5149\u6e90\u3078\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30af\u30aa\u30ea\u30c6\u30a3\u306e\u30d0\u30e9\u30f3\u30b9\u8abf\u6574<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6280\u8853\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30ea\u30a2\u30eb\u306a3D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u5b9f\u88c5\u6642\u306f\u3001\u7528\u9014\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u624b\u6cd5\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u79d8\u8a23<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u63cf\u753b\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u63cf\u753b\u30b3\u30fc\u30eb\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u52b9\u7387\u7684\u306a\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\nclass BatchRenderer {\nprivate:\n    struct Vertex {\n        glm::vec3 position;\n        glm::vec2 texCoord;\n        glm::vec4 color;\n    };\n\n    static const size_t MAX_VERTICES = 10000;\n    std::vector&lt;Vertex&gt; vertices;\n    GLuint VAO, VBO;\n\npublic:\n    void init() {\n        vertices.reserve(MAX_VERTICES);\n\n        glGenVertexArrays(1, &amp;VAO);\n        glGenBuffers(1, &amp;VBO);\n\n        glBindVertexArray(VAO);\n        glBindBuffer(GL_ARRAY_BUFFER, VBO);\n        glBufferData(GL_ARRAY_BUFFER, MAX_VERTICES * sizeof(Vertex), nullptr, GL_DYNAMIC_DRAW);\n\n        \/\/ \u9802\u70b9\u5c5e\u6027\u306e\u8a2d\u5b9a\n        glEnableVertexAttribArray(0);\n        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));\n        glEnableVertexAttribArray(1);\n        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texCoord));\n        glEnableVertexAttribArray(2);\n        glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color));\n    }\n\n    void submit(const glm::vec3&amp; pos, const glm::vec2&amp; tex, const glm::vec4&amp; color) {\n        vertices.push_back({pos, tex, color});\n    }\n\n    void flush() {\n        glBindBuffer(GL_ARRAY_BUFFER, VBO);\n        glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * sizeof(Vertex), vertices.data());\n        glDrawArrays(GL_TRIANGLES, 0, vertices.size());\n        vertices.clear();\n    }\n};<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u63cf\u753b\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u63cf\u753b\u306e\u5b9f\u88c5\nvoid setupInstancedRendering() {\n    \/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30c7\u30fc\u30bf\uff08\u4f8b\uff1a\u4f4d\u7f6e\u60c5\u5831\uff09\n    std::vector&lt;glm::vec3&gt; translations;\n    for(int i = 0; i &lt; 1000; i++) {\n        translations.push_back(glm::vec3(\n            float(rand() % 100) - 50.0f,\n            float(rand() % 100) - 50.0f,\n            float(rand() % 100) - 50.0f\n        ));\n    }\n\n    \/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u7528\u30d0\u30c3\u30d5\u30a1\u306e\u8a2d\u5b9a\n    GLuint instanceVBO;\n    glGenBuffers(1, &amp;instanceVBO);\n    glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);\n    glBufferData(GL_ARRAY_BUFFER, translations.size() * sizeof(glm::vec3), translations.data(), GL_STATIC_DRAW);\n\n    \/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5c5e\u6027\u306e\u8a2d\u5b9a\n    glEnableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);\n    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), (void*)0);\n    glVertexAttribDivisor(2, 1);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u4e00\u822c\u7684\u306a\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u4e3b\u306a\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u3068\u5bfe\u7b56\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>CPU\u5074\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u983b\u7e41\u306a\u30b9\u30c6\u30fc\u30c8\u5909\u66f4\u306e\u524a\u6e1b<\/li>\n\n\n\n<li>\u30d0\u30c3\u30d5\u30a1\u306e\u66f4\u65b0\u983b\u5ea6\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u5316\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3067\u306e\u30ea\u30bd\u30fc\u30b9\u8aad\u307f\u8fbc\u307f\u4f8b\nclass ResourceLoader {\npublic:\n    void loadResourcesAsync(const std::vector&lt;std::string&gt;&amp; paths) {\n        std::vector&lt;std::future&lt;void&gt;&gt; futures;\n        for (const auto&amp; path : paths) {\n            futures.push_back(std::async(std::launch::async, [this, path]() {\n                \/\/ \u30ea\u30bd\u30fc\u30b9\u306e\u8aad\u307f\u8fbc\u307f\u51e6\u7406\n                loadResource(path);\n            }));\n        }\n\n        \/\/ \u5168\u3066\u306e\u8aad\u307f\u8fbc\u307f\u306e\u5b8c\u4e86\u3092\u5f85\u6a5f\n        for (auto&amp; future : futures) {\n            future.wait();\n        }\n    }\n};<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>GPU\u5074\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b8\u30aa\u30e1\u30c8\u30ea\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30b7\u30a7\u30fc\u30c0\u30fc\u306e\u8907\u96d1\u3055\u306e\u524a\u6e1b<\/li>\n\n\n\n<li>\u30c6\u30af\u30b9\u30c1\u30e3\u30b5\u30a4\u30ba\u3068\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Level of Detail (LOD)\u306e\u5b9f\u88c5\u4f8b\nclass ModelLOD {\nprivate:\n    struct LODLevel {\n        Mesh mesh;\n        float distance;\n    };\n    std::vector&lt;LODLevel&gt; lodLevels;\n\npublic:\n    void render(const glm::vec3&amp; cameraPos) {\n        float distanceToCamera = glm::length(getPosition() - cameraPos);\n\n        \/\/ \u9069\u5207\u306aLOD\u30ec\u30d9\u30eb\u3092\u9078\u629e\n        for (const auto&amp; level : lodLevels) {\n            if (distanceToCamera &lt;= level.distance) {\n                level.mesh.render();\n                break;\n            }\n        }\n    }\n};<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>OpenGL\u306e\u30c7\u30d0\u30c3\u30b0\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void setupDebugCallback() {\n    glEnable(GL_DEBUG_OUTPUT);\n    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);\n    glDebugMessageCallback(debugCallback, nullptr);\n}\n\nvoid GLAPIENTRY debugCallback(GLenum source, GLenum type, GLuint id,\n    GLenum severity, GLsizei length, const GLchar* message, const void* userParam) {\n    std::cout &lt;&lt; \"OpenGL Debug Message:\" &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"Source: \" &lt;&lt; getSourceString(source) &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"Type: \" &lt;&lt; getTypeString(type) &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"Severity: \" &lt;&lt; getSeverityString(severity) &lt;&lt; std::endl;\n    std::cout &lt;&lt; \"Message: \" &lt;&lt; message &lt;&lt; std::endl;\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\u30c4\u30fc\u30eb\u306e\u5b9f\u88c5<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PerformanceTimer {\nprivate:\n    std::chrono::high_resolution_clock::time_point startTime;\n    std::string name;\n\npublic:\n    PerformanceTimer(const std::string&amp; timerName) \n        : name(timerName), startTime(std::chrono::high_resolution_clock::now()) {}\n\n    ~PerformanceTimer() {\n        auto endTime = std::chrono::high_resolution_clock::now();\n        auto duration = std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(endTime - startTime);\n        std::cout &lt;&lt; name &lt;&lt; \": \" &lt;&lt; duration.count() \/ 1000.0f &lt;&lt; \"ms\" &lt;&lt; std::endl;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nvoid render() {\n    PerformanceTimer timer(\"Render Frame\");\n    \/\/ \u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u51e6\u7406\n}<\/pre>\n\n\n\n<p>\u6700\u9069\u5316\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u65e9\u671f\u6700\u9069\u5316\u3092\u907f\u3051\u3001\u5b9f\u969b\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u3092\u7279\u5b9a\u3057\u3066\u304b\u3089\u5bfe\u7b56\u3092\u8b1b\u3058\u308b<\/li>\n\n\n\n<li>\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u30c4\u30fc\u30eb\u3092\u6d3b\u7528\u3057\u3066\u554f\u984c\u7b87\u6240\u3092\u7279\u5b9a<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u3068\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u63cf\u753b\u3092\u9069\u5207\u306b\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u3092\u52b9\u7387\u5316\u3057\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u5316\u306f\u614e\u91cd\u306b\u5b9f\u88c5\u3057\u3001\u540c\u671f\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u3092\u8003\u616e\u3059\u308b<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">OpenGL\u306b\u3088\u308b\u5b9f\u8df5\u7684\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30b7\u30f3\u30d7\u30eb\u306a3D\u30d3\u30e5\u30fc\u30a2\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u57fa\u672c\u7684\u306a3D\u30e2\u30c7\u30eb\u30d3\u30e5\u30fc\u30a2\u306e\u5b9f\u88c5\u3092\u901a\u3058\u3066\u3001\u5b9f\u8df5\u7684\u306aOpenGL\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3092\u5b66\u3073\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ModelViewer {\nprivate:\n    GLFWwindow* window;\n    Camera camera;\n    Shader shader;\n    Model model;\n    glm::mat4 projection;\n\n    struct {\n        float lastX = 400.0f;\n        float lastY = 300.0f;\n        bool firstMouse = true;\n        bool isOrbiting = false;\n    } mouseState;\n\npublic:\n    ModelViewer(const char* modelPath) {\n        initializeWindow();\n        setupCamera();\n        loadShaders();\n        loadModel(modelPath);\n    }\n\n    void run() {\n        while (!glfwWindowShouldClose(window)) {\n            processInput();\n            render();\n            glfwSwapBuffers(window);\n            glfwPollEvents();\n        }\n    }\n\nprivate:\n    void initializeWindow() {\n        glfwInit();\n        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);\n        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n\n        window = glfwCreateWindow(800, 600, \"3D Model Viewer\", NULL, NULL);\n        glfwMakeContextCurrent(window);\n\n        gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);\n\n        \/\/ \u30de\u30a6\u30b9\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u8a2d\u5b9a\n        glfwSetCursorPosCallback(window, [](GLFWwindow* window, double xpos, double ypos) {\n            \/\/ \u30de\u30a6\u30b9\u79fb\u52d5\u51e6\u7406\n        });\n\n        glfwSetScrollCallback(window, [](GLFWwindow* window, double xoffset, double yoffset) {\n            \/\/ \u30ba\u30fc\u30e0\u51e6\u7406\n        });\n    }\n\n    void render() {\n        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n        shader.use();\n        shader.setMat4(\"projection\", projection);\n        shader.setMat4(\"view\", camera.getViewMatrix());\n\n        glm::mat4 modelMatrix = glm::mat4(1.0f);\n        shader.setMat4(\"model\", modelMatrix);\n\n        model.Draw(shader);\n    }\n};<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u306e\u57fa\u790e\u3068\u306a\u308b\u6a5f\u80fd\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u306e\u57fa\u672c\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30b7\u30b9\u30c6\u30e0\nclass GameObject {\nprivate:\n    std::vector&lt;std::unique_ptr&lt;Component&gt;&gt; components;\n    Transform transform;\n\npublic:\n    template&lt;typename T&gt;\n    T* addComponent() {\n        static_assert(std::is_base_of&lt;Component, T&gt;::value, \"T must inherit from Component\");\n        components.push_back(std::make_unique&lt;T&gt;());\n        return static_cast&lt;T*&gt;(components.back().get());\n    }\n\n    template&lt;typename T&gt;\n    T* getComponent() {\n        for (auto&amp; component : components) {\n            if (T* cast = dynamic_cast&lt;T*&gt;(component.get()))\n                return cast;\n        }\n        return nullptr;\n    }\n\n    void update(float deltaTime) {\n        for (auto&amp; component : components) {\n            component-&gt;update(deltaTime);\n        }\n    }\n};\n\n\/\/ \u30b7\u30fc\u30f3\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\nclass Scene {\nprivate:\n    std::vector&lt;std::unique_ptr&lt;GameObject&gt;&gt; gameObjects;\n\npublic:\n    GameObject* createGameObject() {\n        gameObjects.push_back(std::make_unique&lt;GameObject&gt;());\n        return gameObjects.back().get();\n    }\n\n    void update(float deltaTime) {\n        for (auto&amp; obj : gameObjects) {\n            obj-&gt;update(deltaTime);\n        }\n    }\n};<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u30de\u30eb\u30c1\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u306e\u305f\u3081\u306e\u8a2d\u8a08\u30d1\u30bf\u30fc\u30f3\u3068\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u62bd\u8c61\u5316\u30ec\u30a4\u30e4\u30fc\u306e\u5b9f\u88c5<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PlatformInterface {\npublic:\n    virtual ~PlatformInterface() = default;\n    virtual void initialize() = 0;\n    virtual void shutdown() = 0;\n    virtual void processEvents() = 0;\n    virtual void swapBuffers() = 0;\n};\n\nclass WindowsImplementation : public PlatformInterface {\n    \/\/ Windows\u56fa\u6709\u306e\u5b9f\u88c5\n};\n\nclass MacImplementation : public PlatformInterface {\n    \/\/ Mac\u56fa\u6709\u306e\u5b9f\u88c5\n};\n\nclass LinuxImplementation : public PlatformInterface {\n    \/\/ Linux\u56fa\u6709\u306e\u5b9f\u88c5\n};<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ResourceManager {\nprivate:\n    std::unordered_map&lt;std::string, std::shared_ptr&lt;Resource&gt;&gt; resources;\n    static ResourceManager* instance;\n\npublic:\n    template&lt;typename T&gt;\n    std::shared_ptr&lt;T&gt; load(const std::string&amp; path) {\n        if (resources.find(path) != resources.end()) {\n            return std::dynamic_pointer_cast&lt;T&gt;(resources[path]);\n        }\n\n        auto resource = std::make_shared&lt;T&gt;();\n        if (resource-&gt;load(path)) {\n            resources[path] = resource;\n            return resource;\n        }\n        return nullptr;\n    }\n\n    void unload(const std::string&amp; path) {\n        resources.erase(path);\n    }\n\n    static ResourceManager&amp; getInstance() {\n        if (!instance)\n            instance = new ResourceManager();\n        return *instance;\n    }\n};<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Renderer {\nprivate:\n    \/\/ \u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u8a2d\u5b9a\n    struct PlatformSpecificSettings {\n        bool useVSync;\n        bool useMultisampling;\n        int msaaSamples;\n    };\n\n    PlatformSpecificSettings settings;\n\npublic:\n    void initialize() {\n        #ifdef _WIN32\n            settings = getWindowsOptimalSettings();\n        #elif defined(__APPLE__)\n            settings = getMacOptimalSettings();\n        #else\n            settings = getLinuxOptimalSettings();\n        #endif\n\n        applySettings(settings);\n    }\n};<\/pre>\n\n\n\n<p>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u30b3\u30fc\u30c9\u3092\u9069\u5207\u306b\u5206\u96e2<\/li>\n\n\n\n<li>\u5171\u901a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u8a2d\u8a08\u3068\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5225\u306e\u6700\u9069\u5316\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u4e00\u5143\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u7d71\u4e00\u5316<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u3068\u30d1\u30bf\u30fc\u30f3\u3092\u57fa\u306b\u3001\u5b9f\u8df5\u7684\u306aOpenGL\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u767a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-24\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\uff1aOpenGL\u30de\u30b9\u30bf\u30fc\u3078\u306e\u9053<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u9ad8\u5ea6\u306a\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u6280\u8853\u306e\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30aa\u30f3\u30e9\u30a4\u30f3\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OpenGL\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8: \u6700\u65b0\u306eAPI\u4ed5\u69d8\u3068\u5b9f\u88c5\u8a73\u7d30<\/li>\n\n\n\n<li>learnopengl.com: \u30e2\u30c0\u30f3OpenGL\u306e\u5305\u62ec\u7684\u306a\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb<\/li>\n\n\n\n<li>opengl-tutorial.org: \u5b9f\u8df5\u7684\u306a\u8ab2\u984c\u3068\u89e3\u8aac<\/li>\n\n\n\n<li>docs.gl: OpenGL\u95a2\u6570\u306e\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u3068\u4f7f\u7528\u4f8b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u63a8\u5968\u66f8\u7c4d<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u300cOpenGL Programming Guide\u300d\uff08\u901a\u79f0\uff1aRed Book\uff09<\/li>\n\n\n\n<li>\u300cOpenGL Shading Language\u300d\uff08\u901a\u79f0\uff1aOrange Book\uff09<\/li>\n\n\n\n<li>\u300cReal-Time Rendering\u300d\uff08\u6700\u65b0\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u6280\u8853\uff09<\/li>\n\n\n\n<li>\u300cGame Engine Architecture\u300d\uff08\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u958b\u767a\uff09<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e0a\u7d1a\u8005\u5411\u3051\u5b66\u7fd2\u30c8\u30d4\u30c3\u30af<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30c9\u30d0\u30f3\u30b9\u30c8\u30b7\u30a7\u30fc\u30c7\u30a3\u30f3\u30b0\u6280\u8853\n<ul class=\"wp-block-list\">\n<li>PBR\uff08\u7269\u7406\u30d9\u30fc\u30b9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\uff09<\/li>\n\n\n\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u30a4\u30eb\u30df\u30cd\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30b5\u30d6\u30b5\u30fc\u30d5\u30a7\u30b9\u30b9\u30ad\u30e3\u30c3\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\n<ul class=\"wp-block-list\">\n<li>GPU\u30a4\u30f3\u30b9\u30bf\u30f3\u30b7\u30f3\u30b0<\/li>\n\n\n\n<li>\u30d5\u30e9\u30b9\u30bf\u30e0\u30ab\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30aa\u30af\u30eb\u30fc\u30b8\u30e7\u30f3\u30ab\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30e2\u30c0\u30f3\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30a3\u30d5\u30a1\u30fc\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30d5\u30a9\u30ef\u30fc\u30c9\u30d7\u30e9\u30b9<\/li>\n\n\n\n<li>\u30bf\u30a4\u30eb\u30d9\u30fc\u30b9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u5b9f\u8df5\u7684\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30a2\u30a4\u30c7\u30a2\u3068\u5b9f\u88c5\u306e\u30d2\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u57fa\u790e\u529b\u5f37\u5316\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30e0\u30b7\u30a7\u30fc\u30c0\u30fc\u30a8\u30c7\u30a3\u30bf\u306e\u958b\u767a<\/li>\n\n\n\n<li>\u5730\u5f62\u751f\u6210\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30d1\u30fc\u30c6\u30a3\u30af\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u4f5c\u6210<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e2d\u7d1a\u8005\u5411\u3051\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30f3\u30d7\u30eb\u306a3D\u30e2\u30c7\u30ea\u30f3\u30b0\u30c4\u30fc\u30eb<\/li>\n\n\n\n<li>\u7269\u7406\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u30a8\u30f3\u30b8\u30f3<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b7\u30fc\u30b8\u30e3\u30eb\u30c6\u30af\u30b9\u30c1\u30e3\u30b8\u30a7\u30cd\u30ec\u30fc\u30bf\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e0a\u7d1a\u8005\u5411\u3051\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30e0\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u306e\u958b\u767a<\/li>\n\n\n\n<li>\u30ec\u30a4\u30c8\u30ec\u30fc\u30b7\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30b0\u30ed\u30fc\u30d0\u30eb\u30a4\u30eb\u30df\u30cd\u30fc\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n\n\n\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u5b9f\u88c5\u306e\u30d2\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c0f\u898f\u6a21\u306a\u6a5f\u80fd\u304b\u3089\u59cb\u3081\u3066\u5f90\u3005\u306b\u62e1\u5f35<\/li>\n\n\n\n<li>\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u4f5c\u6210\u3068\u6d3b\u7528<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u306e\u7fd2\u6163\u5316<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3068\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">OpenGL\u306e\u6700\u65b0\u30c8\u30ec\u30f3\u30c9\u3068\u3053\u308c\u304b\u3089\u306e\u5c55\u671b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6700\u65b0\u6280\u8853\u30c8\u30ec\u30f3\u30c9<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30a4\u30c8\u30ec\u30fc\u30b7\u30f3\u30b0\u3068\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u6a5f\u68b0\u5b66\u7fd2\u3092\u6d3b\u7528\u3057\u305f\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u30b0\u30ed\u30fc\u30d0\u30eb\u30a4\u30eb\u30df\u30cd\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30e2\u30d0\u30a4\u30eb\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u306e\u9032\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c06\u6765\u306e\u5c55\u671b<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WebGPU\u3068\u306e\u95a2\u4fc2<\/li>\n\n\n\n<li>Vulkan\u3068\u306e\u5171\u5b58<\/li>\n\n\n\n<li>\u30af\u30e9\u30a6\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u306e\u767a\u5c55<\/li>\n\n\n\n<li>AR\/VR\u5411\u3051\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30ea\u30a2\u30d1\u30b9<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u30a8\u30f3\u30b8\u30cb\u30a2<\/li>\n\n\n\n<li>\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u958b\u767a\u8005<\/li>\n\n\n\n<li>\u30c6\u30af\u30cb\u30ab\u30eb\u30a2\u30fc\u30c6\u30a3\u30b9\u30c8<\/li>\n\n\n\n<li>\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u30a8\u30f3\u30b8\u30cb\u30a2<\/li>\n<\/ul>\n\n\n\n<p>\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u306e\u305f\u3081\u306e\u30a2\u30c9\u30d0\u30a4\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3078\u306e\u53c2\u52a0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub\u4e0a\u306e\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/li>\n\n\n\n<li>\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u958b\u767a\u8005\u30d5\u30a9\u30fc\u30e9\u30e0<\/li>\n\n\n\n<li>\u6280\u8853\u30ab\u30f3\u30d5\u30a1\u30ec\u30f3\u30b9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6700\u65b0\u52d5\u5411\u306e\u30ad\u30e3\u30c3\u30c1\u30a2\u30c3\u30d7<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SIGGRAPH\u8ad6\u6587\u3068\u767a\u8868<\/li>\n\n\n\n<li>GDC\u30bb\u30c3\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9API\u66f4\u65b0\u60c5\u5831<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u7ba1\u7406\u3068\u30b3\u30fc\u30c9\u54c1\u8cea<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u306e\u9069\u5207\u306a\u5229\u7528<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u7d99\u7d9a\u7684\u306a\u6539\u5584<\/li>\n<\/ul>\n\n\n\n<p>OpenGL\u306f\u4eca\u5f8c\u30823D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u958b\u767a\u306e\u91cd\u8981\u306a\u9078\u629e\u80a2\u3067\u3042\u308a\u7d9a\u3051\u307e\u3059\u3002\u65b0\u3057\u3044\u6280\u8853\u3084API\u306e\u51fa\u73fe\u306b\u5fdc\u3058\u3066\u3001\u9069\u6750\u9069\u6240\u3067\u4f7f\u3044\u5206\u3051\u3066\u3044\u304f\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":{"0":"post-1599","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-cpp","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1599"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1599\/revisions"}],"predecessor-version":[{"id":1600,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1599\/revisions\/1600"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}