{"id":44773712,"url":"https://github.com/kikonen/learnopengl","last_synced_at":"2026-02-16T06:08:54.598Z","repository":{"id":59630625,"uuid":"324418994","full_name":"kikonen/learnopengl","owner":"kikonen","description":"See my YouTube channel!!","archived":false,"fork":false,"pushed_at":"2026-02-07T18:50:17.000Z","size":305361,"stargazers_count":1,"open_issues_count":86,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-08T03:24:35.451Z","etag":null,"topics":["opengl","programming"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/@kikonen","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kikonen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-12-25T19:11:07.000Z","updated_at":"2026-01-13T21:13:40.000Z","dependencies_parsed_at":"2023-11-26T09:25:53.776Z","dependency_job_id":"ee1c618f-f004-4370-be34-c281e8566437","html_url":"https://github.com/kikonen/learnopengl","commit_stats":null,"previous_names":[],"tags_count":98,"template":false,"template_full_name":null,"purl":"pkg:github/kikonen/learnopengl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kikonen%2Flearnopengl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kikonen%2Flearnopengl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kikonen%2Flearnopengl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kikonen%2Flearnopengl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kikonen","download_url":"https://codeload.github.com/kikonen/learnopengl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kikonen%2Flearnopengl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29501537,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T05:57:17.024Z","status":"ssl_error","status_checked_at":"2026-02-16T05:56:49.929Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["opengl","programming"],"created_at":"2026-02-16T06:08:53.900Z","updated_at":"2026-02-16T06:08:54.590Z","avatar_url":"https://github.com/kikonen.png","language":"C++","readme":"\n# General\n\nThis is just scatchpad app for following OpenGL tutorial at learnopengl.com.\n\n# SETUP\n\n## Sub modules\n\n```bash\ngit submodule init\ngit submodule update --init  --recursive\n```\n## Build assets\n\n### Install ruby\n\nRuby+Devkit 3.4.1-2 (x64) (https://rubyinstaller.org)\n\n```bash\n$ cat ~/.irbrc\nIRB.conf[:USE_AUTOCOMPLETE] = false\n```\n\n### Setup\n\n```bash\nbundle install\n```\n\n#### .rdbgrc\n```\n#\n# https://github.com/ruby/debug\n#\n\nconfig set no_hint true\nconfig set show_frames 0\nconfig set use_short_path true\nconfig set no_reline 1\n```\n\n#### .irbrc\n```\n#\n# https://ruby-doc.org/3.4.1/stdlibs/irb/IRB.html#module-IRB-label-Configuration\n#\n# @see IRB.conf\n\nIRB.conf[:USE_AUTOCOMPLETE] = false\n#IRB.conf[:PROMPT_MODE] = :SIMPLE\n#IRB.conf[:USE_PAGER] = false\n#IRB.conf[:BACK_TRACE_LIMIT] = 0\n#IRB.conf[:CONTEXT_MODE] = 0\n#IRB.conf[:INSPECT_MODE] = false\n#IRB.conf[:COMMAND_ALIASES] = {}\n```\n\n\n### prepare assets\n\n```bash\n# all\nruby script/encode_ktx.rb meta --src resources/assets --dry-run false --recursive true --target-size 20248\n\n# single\nruby script/encode_ktx.rb meta --src resources/assets/textures/Metal022_1K-PNG --dry-run false --force true\n```\n\n### build assets\n\n```bash\n# all\nruby script/encode_ktx.rb build --src resources/assets --dry-run false --recursive true --target-size 2048 --encode --combine\n\n# single\nruby script/encode_ktx.rb build --src resources/assets/textures/Metal022_1K-PNG --dry-run false --target-size 2048  --encode --combine --force true\n\n```\n\n## vcpkg-registry\n\n### Clone vcpkg-registry\n```bash\n# into same level as learnopengl repo\ncd $ROOT\ngit clone git@github.com:kikonen/vcpkg-registry.git\n```\n### Test vcpkg-registry\n```powershell\n# NOTE KI in *POWERSHELL** not bash\ncd learnopengl\nvcpkg install --feature-flags=registries,manifests\n```\n\n## opengl GLAD setup\n\n1) generae package\nhttps://glad.dav1d.de\n\n- include\n  * GL_ARB_Bindless_Texture\n\n2) Download\n\n3) Unzip into vendor/glad\n\n## Vendor modules\n\n### generator\n\nFor generating simple basic meshes\nhttps://github.com/ilmola/generator\n\n\n# TODO/Research\n- \"shell based grass and fur\"\n  + https://gim.studio/an-introduction-to-shell-based-fur-technique/\n  + https://xbdev.net/directx3dx/specialX/Fur/index.php\n  + https://www.researchgate.net/figure/Close-view-of-grass-rendered-with-16-shells_fig3_244493698\n  + http://www.catalinzima.com/xna/tutorials/fur-rendering/\n  + https://stackoverflow.com/questions/19862841/fur-shading-using-glsl\n- ECS\n  + https://skypjack.github.io/entt/md_docs_md_entity.html\n  * https://habr.com/en/post/651921/\n\n\n# Misc techniques\n\n## OpenGL Specs\n- https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.html\n\n## UBO/SSBO alignment\n- https://computergraphics.stackexchange.com/questions/5810/shader-storage-buffer-indexing-by-4-bytes-instead-of-3\n- https://stackoverflow.com/questions/38172696/should-i-ever-use-a-vec3-inside-of-a-uniform-buffer-or-shader-storage-buffer-o\n\n## VBO buffer (interleaved or separate streams)\n- https://www.reddit.com/r/vulkan/comments/rtpdvu/interleaved_vs_separate_vertex_buffers/\n- https://www.reddit.com/r/opengl/comments/155jq8v/whats_better_multiple_vertex_buffers_or_a_single/\n\n## Billboard\n\n- https://ogldev.org/www/tutorial27/tutorial27.html\n  * applied for \"point sprite\" billboard\n- http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/billboards/\n  * applied for \"quad\" billboard\n- https://gamedev.stackexchange.com/questions/113147/rotate-billboard-towards-camera\n- https://stackoverflow.com/questions/18048925/opengl-billboard-matrix\n- https://stackoverflow.com/questions/18048925/opengl-billboard-matrix\n- https://www.mathsisfun.com/algebra/matrix-inverse.html\n- https://mathinsight.org/matrix_transpose\n- https://stackoverflow.com/questions/15325752/how-to-create-billboard-matrix-in-glm\n- https://stackoverflow.com/questions/5467007/inverting-rotation-in-3d-to-make-an-object-always-face-the-camera\n- https://gamedev.stackexchange.com/questions/5959/rendering-2d-sprites-into-a-3d-world\n  * applied for \"quad\" billboard\n- https://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml\n\n## Frustum culling\n- https://www.lighthouse3d.com/tutorials/view-frustum-culling/clip-space-approach-extracting-the-planes/\n- https://cgvr.cs.uni-bremen.de/teaching/cg_literatur/lighthouse3d_view_frustum_culling/index.html\n- https://zeux.io/2009/01/31/view-frustum-culling-optimization-introduction/\n- https://fgiesen.wordpress.com/2010/10/17/view-frustum-culling/\n- https://gamedev.stackexchange.com/questions/73682/frustum-culling-based-on-mvp-matrix\n\n## GPU frustum/occlusion culling\n- https://cpp-rendering.io/indirect-rendering/\n- https://registry.khronos.org/OpenGL/extensions/ARB/ARB_indirect_parameters.txt\n- https://forum.unity.com/threads/gpu-frustum-culling-tips.1102627/\n- https://bazhenovc.github.io/blog/post/gpu-driven-occlusion-culling-slides-lif/\n\n## CPU frustum culling\n - Fast Extraction of Viewing Frustum Planes from the World- View-Projection Matrix\n- http://gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf\n- https://www.reddit.com/r/gamedev/comments/5zatbm/frustum_culling_in_opengl_glew_c/\n- https://donw.io/post/frustum-point-extraction/\n- https://iquilezles.org/articles/frustum/\n- https://gist.github.com/podgorskiy/e698d18879588ada9014768e3e82a644\n- https://stackoverflow.com/questions/8115352/glmperspective-explanation\n\n## Compute shader\n- https://computergraphics.stackexchange.com/questions/400/synchronizing-successive-opengl-compute-shader-invocations\n- https://www.reddit.com/r/vulkan/comments/lh9cu1/do_compute_shaders_only_parallelize_up_to_local/\n\n## GPU Texture Compression\n- KTX software\n  + https://github.com/KhronosGroup/KTX-Software\n  + https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md\n  + https://github.khronos.org/KTX-Software/libktx/index.html\n  + https://github.khronos.org/KTX-Software/ktxtools/toktx.html\n  + https://github.com/snowkit/ktx-format\n\n## Screen space ambient occlusion (SSAO)\n- https://learnopengl.com/Advanced-Lighting/SSAO\n- https://alextardif.com/SSAO.html\n- https://john-chapman-graphics.blogspot.com/2013/01/ssao-tutorial.html\n- https://docs.nvidia.com/gameworks/content/gameworkslibrary/visualfx/hbao/product.html\n- https://github.com/NVIDIAGameWorks/HBAOPlus\n\n**ktx albedo**\n```bash\nktxinfo.exe Planks09_col_2048.ktx\n```\n\n**Compress**\n```bash\ntoktx.exe --verbose --genmipmap --encode astc Planks09_col_2048.ktx Planks09_col_2048.png\n```\n\n## Scripting\n- http://lua-users.org/wiki/ScopeTutorial\n- https://sol2.readthedocs.io/en/latest/tutorial/all-the-things.html\n- https://sol2.readthedocs.io/en/latest/tutorial/functions.html\n- https://github.com/ThePhD/sol2/issues/90\n- https://blog.rubenwardy.com/2020/07/22/sol3-vector-extension/\n- https://www.youtube.com/watch?v=1d8SbBIGvUY\u0026list=PLtI3Y3gOLHgpqnRPhqRW4ahSaXePoILNn\u0026index=1\n- https://sol2.readthedocs.io/en/latest/safety.html\n\n## Skybox\n- https://www.flipcode.com/archives/Skybox_With_A_Single_Quad.shtml\n- https://www.rioki.org/2013/03/07/glsl-skybox.html\n\n## Height map\n- https://learnopengl.com/Guest-Articles/2021/Tessellation/Height-map\n- https://stackoverflow.com/questions/41713631/what-is-the-correct-way-to-sample-a-16-bit-height-map-in-opengl\n\n## Tessellation\n- https://gamedev.stackexchange.com/questions/87616/opengl-quad-tessellation-control-shader\n- https://ogldev.org/www/tutorial30/tutorial30.html\n- https://yiweimao.github.io/blog/tessellation/\n- https://www.khronos.org/opengl/wiki/Tessellation\n\n## G-buffer\n- https://learnopengl.com/Advanced-Lighting/Deferred-Shading\n- https://www.khronos.org/opengl/wiki/Compute_eye_space_from_window_space\n- https://stackoverflow.com/questions/38172696/should-i-ever-use-a-vec3-inside-of-a-uniform-buffer-or-shader-storage-buffer-o\n  * vec3 alignment *is* broken in opengl std140\n- https://www.reddit.com/r/GraphicsProgramming/comments/zxrww8/should_i_have_tangents_in_my_gbuffer_in_a/\n  * tangent space lighting typically happens in forward renderers\n- normal encoding\n  + https://gamedev.stackexchange.com/questions/162248/correctly-transforming-normals-for-g-buffer-in-deferred-rendering\n  + http://c0de517e.blogspot.com/2015/01/notes-on-g-buffer-normal-encodings.html\n    * example of g-buffer encoding\n  +  https://github.khronos.org/KTX-Software/ktxtools/ktx_encode.html\n  + https://gamedev.stackexchange.com/questions/203188/problems-with-normal-recovery-from-storage-as-two-floats-and-normal-from-depth-b\n  + https://aras-p.info/texts/CompactNormalStorage.html\n  * https://gamedev.stackexchange.com/questions/46304/how-does-gl-int-2-10-10-10-rev-work-for-color-data\n\n## Skeletal animation\n- https://github.com/assimp/assimp\n- https://assimp-docs.readthedocs.io/en/latest/usage/use_the_lib.html\n- https://realitymultiplied.wordpress.com/2016/04/12/assimp-skeletal-animation-tutorial-intro/\n- https://xphere.me/2019/05/bones-animation-with-openglassimpglm/\n- https://www.gamedev.net/forums/topic/688121-skeletal-animation-assimp-glm-and-me-in-between33/\n- https://realitymultiplied.wordpress.com/2016/04/12/assimp-skeletal-animation-tutorial-intro/\n- https://animcoding.com/post/animation-tech-intro-part-1-skinning\n- https://vladh.net/game-engine-skeletal-animation/\n- https://community.khronos.org/t/skeletal-animation-bones-for-models-or-bones-for-meshes/76044/2\n- https://forum.babylonjs.com/t/how-weapon-is-attached-to-a-rigged-animation/17603/2\n- https://blog.demofox.org/2012/09/21/anatomy-of-a-skeletal-animation-system-part-1/\n\n## CSM\n- https://ogldev.org/www/tutorial49/tutorial49.html\n- https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping\n- https://learnopengl.com/Guest-Articles/2021/CSM\n- https://stackoverflow.com/questions/28847767/cascaded-shadow-maps-not-quite-right\n- https://stackoverflow.com/questions/40323029/cascaded-shadow-map-texture-access-bug-on-openglgl\n- https://www.reddit.com/r/vulkan/comments/g0l8u5/sampler2darrayshadow_doesnt_work/\n\n## Geometry shader\n- https://www.informit.com/articles/article.aspx?p=2120983\u0026seqNum=2\n- https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL)\n  + pass \"gl_ClipDistance[CLIP_COUNT]\" to pass through gs shader\n\n## Physics\n- Open Dynamis Engine\n  * https://ode.org/wiki/index.php\n  * https://ode.org/wiki/index.php/Special:ShortPages\n\n## Quaternions\n- https://eater.net/quaternions\n- https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation\n- http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/\n- https://danceswithcode.net/engineeringnotes/quaternions/quaternions.html\n- https://gamedev.stackexchange.com/questions/149006/direction-vector-to-quaternion\n- https://glm.g-truc.net/0.9.0/api/a00135.html\n- https://miz-ar.info/glm-notes/gtc/quaternion.html\n- https://www.3dgep.com/understanding-quaternions/\n- https://stackoverflow.com/questions/1171849/finding-quaternion-representing-the-rotation-from-one-vector-to-another\n\n## Audio\n- OpenAL\n  * https://www.openal.org\n  * https://en.wikipedia.org/wiki/OpenAL\n- OpenAL tutorial\n  * https://indiegamedev.net/2020/02/15/the-complete-guide-to-openal-with-c-part-1-playing-a-sound/\n  * https://indiegamedev.net/2020/02/25/the-complete-guide-to-openal-with-c-part-2-streaming-audio/\n  * https://indiegamedev.net/2020/04/12/the-complete-guide-to-openal-with-c-part-3-positioning-sounds/\n- Video tutorial 2\n  * https://www.youtube.com/watch?v=ptjIf_9CKGE\u0026list=PLRIWtICgwaX2VNpAFjAZdlQw2pA1-5kU8\u0026index=2\n- Libaries\n  * https://github.com/kcat/openal-soft\n  * https://github.com/adamstark/AudioFile\n  * https://github.com/mackron/dr_libs\n\n## Misc\n- https://stackoverflow.com/questions/5532595/about-opengl-texture-coordinates\n- https://stackoverflow.com/questions/27600045/the-correct-way-to-calculate-normal-matrix\n- http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/\n- https://learnopengl.com/Lighting/Basic-Lighting\n- http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/\n- https://stackoverflow.com/questions/27600045/the-correct-way-to-calculate-normal-matrix\n- https://community.khronos.org/t/sampler-array-limit-with-bindless-textures/73856/2\n- https://www.khronos.org/opengl/wiki/Early_Fragment_Test\n- https://www.khronos.org/opengl/wiki/Image_Format\n- https://www.gamedev.net/forums/topic/700517-performance-question-alpha-texture-vs-frag-shader-discard/5397906/\n- https://iquilezles.org/articles/distfunctions/\n- http://wiki.ogre3d.org/tiki-index.php?page=-Point+Light+Attenuation\n\n## C++\n- https://en.cppreference.com/w/\n- https://stackoverflow.com/questions/9954518/stdunique-ptr-with-an-incomplete-type-wont-compile\n- https://blog.andreiavram.ro/cpp-custom-allocators-first-step/\n- https://en.cppreference.com/w/cpp/language/new\n- https://medium.com/@yakupcengiz/comparing-std-map-and-std-unordered-map-in-c-92aa18c5dc39\n\n## Visual C++\n- https://preshing.com/20110711/visual-c-performance-pitfalls/\n- __security_check_cookie\n  + https://preshing.com/20110807/the-cost-of-buffer-security-checks-in-visual-c/\n  + https://nfrechette.github.io/2020/06/26/buffer_security_checks/\n  + https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/security-init-cookie\n  + https://learn.microsoft.com/en-us/cpp/build/reference/sdl-enable-additional-security-checks?view=msvc-170\n\n## SIMD\n- https://gamedev.stackexchange.com/questions/132549/how-to-use-glm-simd-using-glm-version-0-9-8-2\n\n## UUID\n- https://github.com/mariusbancila/stduuid\n- https://stackoverflow.com/questions/2351087/what-is-the-best-32bit-hash-function-for-short-strings-tag-names\n- http://www.orthogonal.com.au/computers/hashstrings/\n- https://github.com/google/crc32c\n\n## Libraries\n- https://github.com/nothings/stb\n- https://github.com/wqking/eventpp\n\n# References\n\n- https://learnopengl.com\n- https://glad.dav1d.de\n- https://www.glfw.org/faq.html#11---what-is-glfw\n- https://www.glfw.org/docs/latest/\n- https://open.gl/drawing\n- https://github.com/nothings/stb\n- https://github.com/nothings/stb/blob/master/stb_image.h\n- http://paulbourke.net/dataformats/obj/\n- http://paulbourke.net/dataformats/mtl/\n- http://www.opengl-tutorial.org/beginners-tutorials/tutorial-7-model-loading/\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkikonen%2Flearnopengl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkikonen%2Flearnopengl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkikonen%2Flearnopengl/lists"}