{"id":632,"date":"2026-05-29T17:13:42","date_gmt":"2026-05-29T21:13:42","guid":{"rendered":"https:\/\/www.ideepix.nl\/projects\/?p=632"},"modified":"2026-05-29T17:16:08","modified_gmt":"2026-05-29T21:16:08","slug":"crosshatch-shading","status":"publish","type":"post","link":"https:\/\/www.ideepix.nl\/projects\/blog\/crosshatch-shading\/","title":{"rendered":"Crosshatch Shading"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Two decades ago I created the animation <a href=\"https:\/\/www.ideepix.nl\/work\/archive_show.php?n=20\">Seeing Red<\/a>. It was rendered in a Non-Photorealistic style (rendered using stylized depiction) with a custom <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mental_Ray\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Mental_Ray\" target=\"_blank\" rel=\"noreferrer noopener\">Mental Ray<\/a> shader in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Autodesk_Softimage\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Autodesk_Softimage\" target=\"_blank\" rel=\"noreferrer noopener\">Softimage XSI<\/a>. Both those pieces of software are now defunct. I described the process on <a href=\"https:\/\/www.ideepix.nl\/work\/research.php?what=NonPhoto\" data-type=\"link\" data-id=\"https:\/\/www.ideepix.nl\/work\/research.php?what=NonPhoto\">an old page on this website<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> I am considering using a similar technique for my next 3D animation. The Mental Ray shader was written in C++ and is not compatible with <a href=\"https:\/\/blender.org\" target=\"_blank\" rel=\"noreferrer noopener\">Blender<\/a>, the 3D computer animation package I finally switched two about two years ago after using Autodesk Maya for about fifteen years.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Blender has an excellent node based shader editor, and using only standard nodes, I was able to (re-)create a crosshatch shader.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls loop src=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/LineShaderTest.mp4\"><\/video><figcaption class=\"wp-element-caption\">Blender test render of my Cross Hatch shader<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the Shader Network I used to create the render posted above:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a243ffbb4220&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a243ffbb4220\" class=\"wp-block-image aligncenter size-medium wp-lightbox-container\"><img decoding=\"async\" width=\"640\" height=\"287\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader-640x287.jpg\" alt=\"Screenshot of the Blender Shader Editor showing the node network for the Crosshatch Shader\" class=\"wp-image-637\" srcset=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader-640x287.jpg 640w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader-1280x574.jpg 1280w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader-768x344.jpg 768w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader-1536x689.jpg 1536w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader-2048x918.jpg 2048w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To the far left of this node network is a node containing this network to get the size of a pixel in world space:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a243ffbb46d6&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a243ffbb46d6\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1280\" height=\"356\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader_pixelSize-1280x356.png\" alt=\"Screenshot of the Blender Shader Editor showing the node network toget the pixel size for the Crosshatch Shader\" class=\"wp-image-639\" srcset=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader_pixelSize-1280x356.png 1280w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader_pixelSize-640x178.png 640w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader_pixelSize-768x214.png 768w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/CrosshatchShader_pixelSize.png 1437w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The CameraVOV and Resolution are linked to camera and scene parameters (angle, and the maximum value of render.resolution_x and render.resolution_y)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Shader does require proper UVs to work. It is hard to get those (relatively) seamless while retaining an even distribution. In an updated version of the shader, the line density is modulated by a hand painted vertex map. I tested this technique on The Teapot.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls loop src=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/TeaPotLines.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I am now working on getting this to look good on my doomscrolling walker guy. I am adding additional parameters, mainly via vertex maps, so I can use a single shader on all, or at least most, objects. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oh, and I need to actually animate the scene I have in mind. Stay tuned!<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a243ffbb4fbc&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a243ffbb4fbc\" class=\"wp-block-image aligncenter size-medium wp-lightbox-container\"><img decoding=\"async\" width=\"203\" height=\"360\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/WalkerGuy-203x360.jpg\" alt=\"Stylized 3D render of character holding phone\" class=\"wp-image-640\" srcset=\"https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/WalkerGuy-203x360.jpg 203w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/WalkerGuy-405x720.jpg 405w, https:\/\/www.ideepix.nl\/projects\/wp-content\/uploads\/2026\/05\/WalkerGuy.jpg 540w\" sizes=\"(max-width: 203px) 100vw, 203px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">My guy looks a bit frightened thinking about what might be happening to him soon.<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>I have been working on creating a Crosshatch shader in Blender using only standard nodes,<\/p>\n","protected":false},"author":3130,"featured_media":634,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":1,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[29,58],"tags":[11,30,37,36,60,59,62,61,31],"class_list":["post-632","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-research","tag-animation","tag-animators-anonymous","tag-b3d","tag-blender","tag-non-photorealistic-rendering","tag-npr","tag-shader","tag-stylized-depiction","tag-wip"],"_links":{"self":[{"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/posts\/632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/users\/3130"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/comments?post=632"}],"version-history":[{"count":6,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/posts\/632\/revisions"}],"predecessor-version":[{"id":646,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/posts\/632\/revisions\/646"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/media\/634"}],"wp:attachment":[{"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/media?parent=632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/categories?post=632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ideepix.nl\/projects\/wp-json\/wp\/v2\/tags?post=632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}