{"id":188,"date":"2020-07-01T00:40:25","date_gmt":"2020-06-30T16:40:25","guid":{"rendered":"https:\/\/teckartist.com\/?page_id=188"},"modified":"2023-02-03T17:26:24","modified_gmt":"2023-02-03T09:26:24","slug":"tech-art-portfolio","status":"publish","type":"page","link":"https:\/\/teckartist.com\/?page_id=188","title":{"rendered":"Tech Art Portfolio"},"content":{"rendered":"\n<p>I&#8217;ve been a technical artist professionally for over a decade now, and the following is a non-exhaustive selection of tech art-y stuff I&#8217;ve done in the last couple of years.<br><br>I have a particular love for building tools and pipelines, but also get a real kick out of working with procedural content generation. I also enjoy creating interesting shaders and effects.<br><br>For posterity, and I suppose some historical context, you can also have a look at some of the things I was involved with at my first professional foray into tech art:<br><a href=\"https:\/\/teckartist.com\/?page_id=75\">https:\/\/teckartist.com\/?page_id=75<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Blender Geometry Nodes<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2023\/02\/XmasTreeLoopA0001-0120-1.mp4\"><\/video><figcaption class=\"wp-element-caption\">Fully procedural christmas tree snowglobe<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2023\/02\/GN_DealingCards.mp4\"><\/video><figcaption class=\"wp-element-caption\">Using geometry nodes to generate card dealing animations that dynamically adapt to number of players, cards per hand, and cards in the deck<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2023\/02\/PortalNodes2a.mp4\"><\/video><figcaption class=\"wp-element-caption\">Recreating Portals in geometry nodes<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Numerous experiments with procedural workflows, from terrain generation (including props and road networks) to procedural buildings. Also experimented with animations augmented with procedural elements.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Houdini<\/h2>\n\n\n<style type=\"text\/css\">\n#foogallery-gallery-239.fg-justified .fg-item { margin-right: 2px; margin-bottom: 2px; }\n#foogallery-gallery-239.fg-justified .fg-image { height: 200px; }<\/style>\n\t\t\t<div class=\"foogallery foogallery-container foogallery-justified foogallery-lightbox-foobox fg-justified fg-ready fg-light fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-always fg-hover-fade fg-hover-zoom2\" id=\"foogallery-gallery-239\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:false},&quot;lazy&quot;:true,&quot;template&quot;:{&quot;rowHeight&quot;:200,&quot;maxRowHeight&quot;:300,&quot;margins&quot;:2,&quot;align&quot;:&quot;center&quot;,&quot;lastRow&quot;:&quot;smart&quot;}}\" style=\"--fg-title-line-clamp: 0; --fg-description-line-clamp: 0;\" >\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Houdini-vines-1.png\" data-caption-title=\"Vine Generator HDA\" data-caption-desc=\"This allowed a level artist to procedurally grow a highly configurable set of vines originating from a &quot;seed&quot; in an environment. The vines conformed to geometry, allowing them to eg. crawl through windows or skylights.\" data-attachment-id=\"190\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img fetchpriority=\"high\" decoding=\"async\" title=\"Vine Generator HDA\" height=\"300\" width=\"416\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Houdini-vines-1\/2887054581.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22416%22%20height%3D%22300%22%20viewBox%3D%220%200%20416%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Vine Generator HDA<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/houdini-road-generation.png\" data-caption-title=\"Road generator HDA\" data-caption-desc=\"Level designer would define start and end points on the terrain, and a road would be generated observing \u201cleast effort\u201d (configurable). This meant that roads would follow valleys\/ridgelines, but also form switchbacks when forced to go up a steep slope.\" data-attachment-id=\"191\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Road generator HDA\" height=\"300\" width=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/houdini-road-generation\/2132330136.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22400%22%20height%3D%22300%22%20viewBox%3D%220%200%20400%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Road generator HDA<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\n\n\n\n<p>Also developed various terrain systems to generate natural-looking terrains from primitive building blocks (define simple mountain, valleys, etc). These would then be automatically populated via configurable rulesets, eg. types and densities of trees, rocks, etc based on altitude, slope, terrain features. Define building placement and automatically terraform the surroundings (flatten slopes, etc).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Substance Designer<\/h2>\n\n\n\n<p>These are 100% procedural and represent only a small selection of assets I&#8217;ve built<\/p>\n\n\n<style type=\"text\/css\">\n#foogallery-gallery-243.fg-justified .fg-item { margin-right: 2px; margin-bottom: 2px; }\n#foogallery-gallery-243.fg-justified .fg-image { height: 200px; }<\/style>\n\t\t\t<div class=\"foogallery foogallery-container foogallery-justified foogallery-lightbox-foobox fg-justified fg-ready fg-light fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-always fg-hover-fade fg-hover-zoom2\" id=\"foogallery-gallery-243\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:false},&quot;lazy&quot;:true,&quot;template&quot;:{&quot;rowHeight&quot;:200,&quot;maxRowHeight&quot;:300,&quot;margins&quot;:2,&quot;align&quot;:&quot;center&quot;,&quot;lastRow&quot;:&quot;smart&quot;}}\" style=\"--fg-title-line-clamp: 0; --fg-description-line-clamp: 0;\" >\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Substance-Reinforced-Concrete.png\" data-caption-desc=\"Entirely procedural reinforced concrete. Concrete damage dynamically reveals underlying rebar.\" data-attachment-id=\"195\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"270\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Substance-Reinforced-Concrete\/2993682948.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22270%22%20height%3D%22300%22%20viewBox%3D%220%200%20270%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Substance-LavaRock.png\" data-attachment-id=\"193\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"256\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Substance-LavaRock\/1145236185.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256%22%20height%3D%22300%22%20viewBox%3D%220%200%20256%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Substance-Hex-Tiles.png\" data-caption-desc=\"Somewhat grungy hexagonal sci fi tiles\" data-attachment-id=\"192\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"282\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Substance-Hex-Tiles\/4118244976.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22282%22%20height%3D%22300%22%20viewBox%3D%220%200%20282%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Substance-Rock-Wall.png\" data-attachment-id=\"196\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"292\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Substance-Rock-Wall\/2686742660.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292%22%20height%3D%22300%22%20viewBox%3D%220%200%20292%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Substance-Mossy-Stone-Tiles.png\" data-attachment-id=\"194\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"287\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Substance-Mossy-Stone-Tiles\/766815423.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22287%22%20height%3D%22300%22%20viewBox%3D%220%200%20287%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/Substance-Stone-Blocks.png\" data-attachment-id=\"197\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"271\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/Substance-Stone-Blocks\/3036481546.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22271%22%20height%3D%22300%22%20viewBox%3D%220%200%20271%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\n\n\n\n<p>Writing algorithms in node networks can be pretty frustrating and error-prone. I found myself doing a lot of this at some point, and built a set of python scripts to build out the node networks for me.<\/p>\n\n\n<style type=\"text\/css\">\n#foogallery-gallery-244.fg-justified .fg-item { margin-right: 2px; margin-bottom: 2px; }\n#foogallery-gallery-244.fg-justified .fg-image { height: 200px; }<\/style>\n\t\t\t<div class=\"foogallery foogallery-container foogallery-justified foogallery-lightbox-foobox fg-justified fg-ready fg-light fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-always fg-hover-fade fg-hover-zoom2\" id=\"foogallery-gallery-244\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:false},&quot;lazy&quot;:true,&quot;template&quot;:{&quot;rowHeight&quot;:200,&quot;maxRowHeight&quot;:300,&quot;margins&quot;:2,&quot;align&quot;:&quot;center&quot;,&quot;lastRow&quot;:&quot;smart&quot;}}\" style=\"--fg-title-line-clamp: 0; --fg-description-line-clamp: 0;\" >\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/python-to-substance1.png\" data-attachment-id=\"203\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"374\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/python-to-substance1\/2236605483.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22374%22%20height%3D%22300%22%20viewBox%3D%220%200%20374%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/python-to-substance2.png\" data-attachment-id=\"204\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"317\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/python-to-substance2\/2135256918.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22317%22%20height%3D%22300%22%20viewBox%3D%220%200%20317%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/python-to-substance3.png\" data-attachment-id=\"205\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" height=\"300\" width=\"473\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/python-to-substance3\/1834890711.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22473%22%20height%3D%22300%22%20viewBox%3D%220%200%20473%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\n\n\n\n<p>Additionally, prior to proper python support being added, I wrote a set of scripts to parse sbs files and perform numerous automation tasks.<\/p>\n\n\n\n<p>&#8211;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tools<\/h2>\n\n\n<style type=\"text\/css\">\n#foogallery-gallery-245.fg-justified .fg-item { margin-right: 2px; margin-bottom: 2px; }\n#foogallery-gallery-245.fg-justified .fg-image { height: 200px; }<\/style>\n\t\t\t<div class=\"foogallery foogallery-container foogallery-justified foogallery-lightbox-foobox fg-justified fg-ready fg-light fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-always fg-hover-fade fg-hover-zoom2\" id=\"foogallery-gallery-245\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:false},&quot;lazy&quot;:true,&quot;template&quot;:{&quot;rowHeight&quot;:200,&quot;maxRowHeight&quot;:300,&quot;margins&quot;:2,&quot;align&quot;:&quot;center&quot;,&quot;lastRow&quot;:&quot;smart&quot;}}\" style=\"--fg-title-line-clamp: 0; --fg-description-line-clamp: 0;\" >\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/vertexPainter1-1.gif\" data-caption-title=\"Vertex Painter\" data-caption-desc=\"Built a custom vertex painter as a Unity editor tool\" data-attachment-id=\"211\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Vertex Painter\" height=\"300\" width=\"355.26315789474\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/vertexPainter1-1.gif\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22355.26315789474%22%20height%3D%22300%22%20viewBox%3D%220%200%20355.26315789474%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Vertex Painter<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/PivotTool.gif\" data-caption-title=\"PivotTool\" data-caption-desc=\"Custom Pivot Tool (https:\/\/github.com\/TeckUnity\/PivotTool)\" data-attachment-id=\"225\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"PivotTool\" height=\"300\" width=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/07\/PivotTool\/3287114627.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22400%22%20height%3D%22300%22%20viewBox%3D%220%200%20400%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">PivotTool<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/HierarchyTools.png\" data-caption-title=\"HierarchyTools\" data-caption-desc=\"Custom Hierarchy Tools (https:\/\/github.com\/TeckUnity\/HierarchyTools)\" data-attachment-id=\"224\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"HierarchyTools\" height=\"300\" width=\"199\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/07\/HierarchyTools\/3168245499.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22199%22%20height%3D%22300%22%20viewBox%3D%220%200%20199%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">HierarchyTools<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/image.png\" data-caption-title=\"Dependency Graph\" data-caption-desc=\"Tracking upstream asset dependencies was getting to be a nightmare on a project, so I built a Dependency Graph tool to allow us to easily track down stray dependencies or asset duplication.\" data-attachment-id=\"208\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Dependency Graph\" height=\"300\" width=\"418\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/image\/2352133372.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22418%22%20height%3D%22300%22%20viewBox%3D%220%200%20418%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Dependency Graph<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\n\n\n\n<div class=\"wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2023\/02\/FlowPainter20230203.mp4\"><\/video><figcaption class=\"wp-element-caption\">In-development followup to my old[!] Flowmap Painter application. Author flowmaps directly on model, inside Unity (and eventually as a standalone application) without worrying about UVs.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video autoplay controls loop src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/uiSnapping1-2.mp4\"><\/video><figcaption class=\"wp-element-caption\"> <br>Unity&#8217;s UI snapping was pretty lacking, so I built this to allow our UI artists to work a little more comfortably (mimics Photoshop&#8217;s snapping features) <\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/teckartist.com\/ToolsnStuff\/flowMapPainter.jpg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Standalone <a href=\"https:\/\/teckartist.com\/?page_id=107\">Flowmap Painter<\/a> built ages ago to solve the problem of flowmaps being extremely artist-unfriendly to author<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-video\"><video autoplay controls loop src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/splinePlacement2.mp4\"><\/video><figcaption class=\"wp-element-caption\"> <br>Built a custom spline tool for a racing game project. Generate ribbon geometry (eg. for road surface and skirting), spawn props, create collision geometry<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video autoplay controls loop muted src=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/hw_19_pixel_art_editor.mp4\"><\/video><figcaption class=\"wp-element-caption\">Built a pixel art tool (and dogfooded it!) as a Unity editor window as part of Unity&#8217;s HackWeek 2019.<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Shaders\/VFX<\/h2>\n\n\n<style type=\"text\/css\">\n#foogallery-gallery-247.fg-justified .fg-item { margin-right: 2px; margin-bottom: 2px; }\n#foogallery-gallery-247.fg-justified .fg-image { height: 200px; }<\/style>\n\t\t\t<div class=\"foogallery foogallery-container foogallery-justified foogallery-lightbox-foobox fg-justified fg-ready fg-light fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-always fg-hover-fade fg-hover-zoom2\" id=\"foogallery-gallery-247\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:false},&quot;lazy&quot;:true,&quot;template&quot;:{&quot;rowHeight&quot;:200,&quot;maxRowHeight&quot;:250,&quot;margins&quot;:2,&quot;align&quot;:&quot;center&quot;,&quot;lastRow&quot;:&quot;smart&quot;}}\" style=\"--fg-title-line-clamp: 0; --fg-description-line-clamp: 0;\" >\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/crashingwaves2.gif\" data-caption-title=\"Ocean\" data-caption-desc=\"Custom shaders and cascade for ocean and crashing waves\" data-attachment-id=\"199\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Ocean\" height=\"250\" width=\"643.77682403433\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/crashingwaves2.gif\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22643.77682403433%22%20height%3D%22250%22%20viewBox%3D%220%200%20643.77682403433%20250%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Ocean<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/sealife.gif\" data-caption-title=\"Sea Life\" data-caption-desc=\"These sea creatures were animated purely in the vertex shader\" data-attachment-id=\"200\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Sea Life\" height=\"250\" width=\"475\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/sealife\/3471762565.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22475%22%20height%3D%22250%22%20viewBox%3D%220%200%20475%20250%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Sea Life<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/vertexPainter1.gif\" data-caption-title=\"Texture Blending and Wetness\" data-caption-desc=\"Shader to blend texture layers using height maps and configurable thresholds, and introduce \u201cwetness\u201d to a material\" data-attachment-id=\"201\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Texture Blending and Wetness\" height=\"250\" width=\"296\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/vertexPainter1\/2553832361.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22296%22%20height%3D%22250%22%20viewBox%3D%220%200%20296%20250%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Texture Blending and Wetness<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/normalBlending.gif\" data-caption-title=\"Normal Blending\" data-caption-desc=\"Shader making use of mesh distance fields to blend normals between disparate objects\" data-attachment-id=\"206\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"Normal Blending\" height=\"250\" width=\"422\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/normalBlending\/1210623630.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22422%22%20height%3D%22250%22%20viewBox%3D%220%200%20422%20250%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">Normal Blending<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/06\/NPR_Test_20200626a.gif\" data-caption-title=\"NPR Lookdev\" data-caption-desc=\"Personal lookdev for comic-style lighting and a traditional animation feel. Cross hatching for light\/shadow, print-style CMYK halftones for colors (also RGB halftones for spec\/reflection), and a bit of 12fps (configurable) vertex jitter.\" data-attachment-id=\"207\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"NPR Lookdev\" height=\"250\" width=\"241\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/06\/NPR_Test_20200626a\/3842787512.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22241%22%20height%3D%22250%22%20viewBox%3D%220%200%20241%20250%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">NPR Lookdev<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Miscellaneous<\/h2>\n\n\n\n<p class=\"has-medium-font-size\"><a href=\"https:\/\/github.com\/TeckUnity\/AnimationRiggingPlayground\">Exploring runtime animation rigging in Unity&nbsp;(Github&nbsp;repo)<\/a>:-<\/p>\n\n\n<style type=\"text\/css\">\n#foogallery-gallery-249.fg-justified .fg-item { margin-right: 2px; margin-bottom: 2px; }\n#foogallery-gallery-249.fg-justified .fg-image { height: 200px; }<\/style>\n\t\t\t<div class=\"foogallery foogallery-container foogallery-justified foogallery-lightbox-foobox fg-justified fg-ready fg-light fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-always fg-hover-fade fg-hover-zoom2\" id=\"foogallery-gallery-249\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:false},&quot;lazy&quot;:true,&quot;template&quot;:{&quot;rowHeight&quot;:200,&quot;maxRowHeight&quot;:300,&quot;margins&quot;:2,&quot;align&quot;:&quot;center&quot;,&quot;lastRow&quot;:&quot;smart&quot;}}\" style=\"--fg-title-line-clamp: 0; --fg-description-line-clamp: 0;\" >\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/6dofRobotArm.gif\" data-caption-title=\"6dofRobotArm\" data-caption-desc=\"Custom constraint to simulate a 6dof robotic arm\" data-attachment-id=\"228\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"6dofRobotArm\" height=\"300\" width=\"341.66666666667\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/6dofRobotArm.gif\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22341.66666666667%22%20height%3D%22300%22%20viewBox%3D%220%200%20341.66666666667%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">6dofRobotArm<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/teckartist.com\/wp-content\/uploads\/2020\/07\/facerig.gif\" data-caption-title=\"facerig\" data-caption-desc=\"Experimented with building in-context rig controls in Unity\" data-attachment-id=\"229\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" title=\"facerig\" height=\"300\" width=\"508\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/teckartist.com\/wp-content\/uploads\/cache\/2020\/07\/facerig\/3796138113.png\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22508%22%20height%3D%22300%22%20viewBox%3D%220%200%20508%20300%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><div class=\"fg-caption-title\">facerig<\/div><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve been a technical artist professionally for over a decade now, and the following is a non-exhaustive selection of tech art-y stuff I&#8217;ve done in the last couple of years. I have a particular love for building tools and pipelines, but also get a real kick out of working with procedural content generation. I also [&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-188","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/teckartist.com\/index.php?rest_route=\/wp\/v2\/pages\/188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/teckartist.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/teckartist.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/teckartist.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/teckartist.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=188"}],"version-history":[{"count":11,"href":"https:\/\/teckartist.com\/index.php?rest_route=\/wp\/v2\/pages\/188\/revisions"}],"predecessor-version":[{"id":290,"href":"https:\/\/teckartist.com\/index.php?rest_route=\/wp\/v2\/pages\/188\/revisions\/290"}],"wp:attachment":[{"href":"https:\/\/teckartist.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}