{"id":56,"date":"2026-07-06T14:57:23","date_gmt":"2026-07-06T12:57:23","guid":{"rendered":"https:\/\/ryasuki.art\/?page_id=56"},"modified":"2026-07-06T14:57:23","modified_gmt":"2026-07-06T12:57:23","slug":"terrain-modelling-from-feature-primitives-on-gpu","status":"publish","type":"page","link":"https:\/\/ryasuki.art\/index.php\/terrain-modelling-from-feature-primitives-on-gpu\/","title":{"rendered":"Terrain Modelling from Feature Primitives on GPU"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">During my time in the LIRIS laboratory I worked with 3 researcher, 2 PhD student and one graphics artist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They developed a novel hierarchical procedural model that combines feature-based primitives to create complex continuous terrains.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The work has been published in a research paper :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>J.-D. G\u00e9nevaux, \u00c9. Galin, A. Peytavie, \u00c9. Gu\u00e9rin, C. Briquet, F. Grosbellet, B. Benes<br>Terrain Modelling from Feature Primitives<br>Computer Graphics Forum (CGF) (2015), vol. 34, num. 6, p. 198-210<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Terrain created using this model can be easily edited, but their implementation did not allow interactive editing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My task was to implement this new model on GPU in order to be able to do interactive editing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is an example of a base terrain combined with some hills and roads :<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"770\" data-id=\"58\" src=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain1-1024x770.png\" alt=\"\" class=\"wp-image-58\" srcset=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain1-1024x770.png 1024w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain1-300x226.png 300w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain1-768x578.png 768w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain1.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"770\" data-id=\"59\" src=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain2-1024x770.png\" alt=\"\" class=\"wp-image-59\" srcset=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain2-1024x770.png 1024w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain2-300x226.png 300w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain2-768x578.png 768w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain2.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"770\" data-id=\"60\" src=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain3-1024x770.png\" alt=\"\" class=\"wp-image-60\" srcset=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain3-1024x770.png 1024w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain3-300x226.png 300w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain3-768x578.png 768w, https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/07\/Terrain3.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">All images are rendered in real time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The interface and CPU part of the implementation used C++ and Qt. The graphic API used was OpenGL 4.4 Core profile and two extensions : GL_NV_DRAW_TEXTURE and GL_NV_BINDLESS_TEXTURE<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also developed an editor, the next video shows the creation of a small piece of terrain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Due to some technical issue I had to use fraps to record the video therefore the Qt interface does not appear)<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/ryasuki.art\/wp-content\/uploads\/2026\/06\/Terrain-Modeling-from-Feature-Primitives-on-GPU-Editor.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Feature available in the editor :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Two different renderer : Ray-tracing and raster graphics using a point grid.<\/li>\n\n\n\n<li>Adding and removing primitives.<\/li>\n\n\n\n<li>Primitive picking.<\/li>\n\n\n\n<li>Copy\/cut paste of primitives.<\/li>\n\n\n\n<li>Intuitive keyboard and mouse control to modify major aspect of primitives.<\/li>\n\n\n\n<li>Property widget to allow modifying any properties.<\/li>\n\n\n\n<li>Set of existing combination to rapidly create hills, mountains, rivers, &#8230;<\/li>\n\n\n\n<li>Benchmark tools (time to render, memory consumption,&#8230;)<\/li>\n\n\n\n<li>Resolution independent from the Qt widget size.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>During my time in the LIRIS laboratory I worked with 3 researcher, 2 PhD student and one graphics artist. They developed a novel hierarchical procedural model that combines feature-based primitives to create complex continuous terrains. The work has been published in a research paper : Terrain created using this model can be easily edited, but [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-56","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/pages\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":2,"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/pages\/56\/revisions"}],"predecessor-version":[{"id":61,"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/pages\/56\/revisions\/61"}],"wp:attachment":[{"href":"https:\/\/ryasuki.art\/index.php\/wp-json\/wp\/v2\/media?parent=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}