{"id":2618,"date":"2015-10-19T11:01:01","date_gmt":"2015-10-19T10:01:01","guid":{"rendered":"http:\/\/www.feedingedge.co.uk\/blog\/?p=2618"},"modified":"2015-10-19T11:51:21","modified_gmt":"2015-10-19T10:51:21","slug":"shady-maths-for-shaders","status":"publish","type":"post","link":"https:\/\/www.feedingedge.co.uk\/blog\/2015\/10\/19\/shady-maths-for-shaders\/","title":{"rendered":"Shady Maths for Shaders"},"content":{"rendered":"\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=epredator\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n<p>I like a good tech challenge and I decided to look a bit more into the world of shaders. I had not fully appreciated how many competing languages there were for these low level compute systems. I had used shaders in Unity3D and I knew we could do fancy things with them. They are wonderfully complicated and full of maths. As with all code you can go native and just write the code directly. There are also tools to help. Things like <a href=\"https:\/\/www.shadertoy.com\" target=\"_blank\">shadertoy<\/a> let you see some of the fun that can be had. It reminds me of hacking with the copper process in the old Amiga days. Low level graphics manipulation, direct to the pipeline.<br \/>\nIn Unity3d there is a tool I bought a while back called ShaderForge. It allows for editing of the shaders but in a visual way. Each little node shows the results of the maths that is going on in its own area. It is common to have this sort of material editing in 3D applications. There is a lot of maths available and I am only just skimming the surface of what can be done.<br \/>\nI was trying to create a realistic wood ring shader. I wanted to do something like that demonstrated <a href=\"http:\/\/lodev.org\/cgtutor\/randomnoise.html#Wood\" target=\"_blank\">here in normal code<\/a> (not any of the shader languages).<br \/>\nI ended up with something that looked like this.<br \/>\n<a data-flickr-embed=\"true\"  href=\"https:\/\/www.flickr.com\/photos\/epredator\/22112020428\/in\/dateposted-public\/\" title=\"ShaderForge Unity3d\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/farm1.staticflickr.com\/598\/22112020428_4fb94e8134_c.jpg\" width=\"800\" height=\"507\" alt=\"ShaderForge Unity3d\"><\/a><script async src=\"\/\/embedr.flickr.com\/assets\/client-code.js\" charset=\"utf-8\"><\/script><br \/>\nIt was nearly the concentric rings, but I can only get it to start from the bottom left corner. I have yet to work out which number I can use for an offset so I can get full circles. I have worked out where to put in variance and noise to make the lines wobble a little. So I am a little stuck if anyone has any suggestions I would be very grateful \ud83d\ude42 I want a random shader texture, slightly different each time which is why I am not using images as I normally do. I am not worried about the colour at the moment BTW. That is a function of scaling the mapping in the sin sweeping function that creates the ripples. I stuck a few extra value modifiers (some set to 0) to see if I could tweak the shader to do what I wanted, but no luck yet. Shaderforge has its own meta data but the thing can be compiled into a full shader in native code.<br \/>\nJust look at what it generates, its fairly full on code.<br \/>\nSo it looks like I have quite a lot of learning to do. With code there is always more, always another language or format for something \ud83d\ude42<\/p>\n<p>***Update Yay for the internet. Dickie replied to this post very very quickly with an image of a very much simpler way for generate the concentric rings. This has massively added to my understanding of the process and is very much appreciated. <\/p>\n<p><code><br \/>\n\/\/ Compiled shader for Web Player, uncompressed size: 14.0KB<\/p>\n<p>\/\/ Skipping shader variants that would not be included into build of current scene.<\/p>\n<p>Shader \"Shader Forge\/wood3\" {<br \/>\nProperties {<br \/>\n _Color (\"Color\", Color) = (0.727941,0.116656,0.0856401,1)<br \/>\n _node_4617 (\"node_4617\", Color) = (0.433823,0.121051,0.0287089,1)<br \/>\n _node_1057 (\"node_1057\", Float) = 0.2<br \/>\n}<br \/>\nSubShader {<br \/>\n Tags { \"RenderType\"=\"Opaque\" }<\/p>\n<p> \/\/ Stats for Vertex shader:<br \/>\n \/\/       d3d11 : 4 math<br \/>\n \/\/        d3d9 : 5 math<br \/>\n \/\/      opengl : 10 math<br \/>\n \/\/ Stats for Fragment shader:<br \/>\n \/\/       d3d11 : 9 math<br \/>\n \/\/        d3d9 : 15 math<br \/>\n Pass {<br \/>\n  Name \"FORWARD\"<br \/>\n  Tags { \"LIGHTMODE\"=\"ForwardBase\" \"SHADOWSUPPORT\"=\"true\" \"RenderType\"=\"Opaque\" }<br \/>\n  GpuProgramID 47164<br \/>\nProgram \"vp\" {<br \/>\nSubProgram \"opengl \" {<br \/>\n\/\/ Stats: 10 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\n\"!!GLSL#version 120<\/p>\n<p>#ifdef VERTEX<\/p>\n<p>varying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);<br \/>\n  xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;<br \/>\n}<\/p>\n<p>#endif<br \/>\n#ifdef FRAGMENT<br \/>\nuniform vec4 _Color;<br \/>\nuniform vec4 _node_4617;<br \/>\nuniform float _node_1057;<br \/>\nvarying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  vec4 tmpvar_1;<br \/>\n  tmpvar_1.w = 1.0;<br \/>\n  tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((<br \/>\n    sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))<br \/>\n   * 11.0) + -10.0)));<br \/>\n  gl_FragData[0] = tmpvar_1;<br \/>\n}<\/p>\n<p>#endif<br \/>\n\"<br \/>\n}<br \/>\nSubProgram \"d3d9 \" {<br \/>\n\/\/ Stats: 5 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\n\"vs_3_0<br \/>\ndcl_position v0<br \/>\ndcl_texcoord v1<br \/>\ndcl_position o0<br \/>\ndcl_texcoord o1.xy<br \/>\ndp4 o0.x, c0, v0<br \/>\ndp4 o0.y, c1, v0<br \/>\ndp4 o0.z, c2, v0<br \/>\ndp4 o0.w, c3, v0<br \/>\nmov o1.xy, v1<\/p>\n<p>\"<br \/>\n}<br \/>\nSubProgram \"d3d11 \" {<br \/>\n\/\/ Stats: 4 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nConstBuffer \"UnityPerDraw\" 336<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\nBindCB  \"UnityPerDraw\" 0<br \/>\n\"vs_4_0<br \/>\nroot12:aaabaaaa<br \/>\neefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa<br \/>\ncmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa<br \/>\naaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl<br \/>\nepfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa<br \/>\naaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa<br \/>\nfdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa<br \/>\neaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa<br \/>\naaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa<br \/>\ngfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa<br \/>\nfgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa<br \/>\negiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak<br \/>\npcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa<br \/>\naaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa<br \/>\naaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa<br \/>\ndoaaaaab\"<br \/>\n}<br \/>\nSubProgram \"opengl \" {<br \/>\n\/\/ Stats: 10 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\n\"!!GLSL#version 120<\/p>\n<p>#ifdef VERTEX<\/p>\n<p>varying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);<br \/>\n  xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;<br \/>\n}<\/p>\n<p>#endif<br \/>\n#ifdef FRAGMENT<br \/>\nuniform vec4 _Color;<br \/>\nuniform vec4 _node_4617;<br \/>\nuniform float _node_1057;<br \/>\nvarying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  vec4 tmpvar_1;<br \/>\n  tmpvar_1.w = 1.0;<br \/>\n  tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((<br \/>\n    sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))<br \/>\n   * 11.0) + -10.0)));<br \/>\n  gl_FragData[0] = tmpvar_1;<br \/>\n}<\/p>\n<p>#endif<br \/>\n\"<br \/>\n}<br \/>\nSubProgram \"d3d9 \" {<br \/>\n\/\/ Stats: 5 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\n\"vs_3_0<br \/>\ndcl_position v0<br \/>\ndcl_texcoord v1<br \/>\ndcl_position o0<br \/>\ndcl_texcoord o1.xy<br \/>\ndp4 o0.x, c0, v0<br \/>\ndp4 o0.y, c1, v0<br \/>\ndp4 o0.z, c2, v0<br \/>\ndp4 o0.w, c3, v0<br \/>\nmov o1.xy, v1<\/p>\n<p>\"<br \/>\n}<br \/>\nSubProgram \"d3d11 \" {<br \/>\n\/\/ Stats: 4 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nConstBuffer \"UnityPerDraw\" 336<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\nBindCB  \"UnityPerDraw\" 0<br \/>\n\"vs_4_0<br \/>\nroot12:aaabaaaa<br \/>\neefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa<br \/>\ncmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa<br \/>\naaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl<br \/>\nepfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa<br \/>\naaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa<br \/>\nfdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa<br \/>\neaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa<br \/>\naaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa<br \/>\ngfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa<br \/>\nfgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa<br \/>\negiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak<br \/>\npcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa<br \/>\naaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa<br \/>\naaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa<br \/>\ndoaaaaab\"<br \/>\n}<br \/>\nSubProgram \"opengl \" {<br \/>\n\/\/ Stats: 10 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" \"VERTEXLIGHT_ON\" }<br \/>\n\"!!GLSL#version 120<\/p>\n<p>#ifdef VERTEX<\/p>\n<p>varying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);<br \/>\n  xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;<br \/>\n}<\/p>\n<p>#endif<br \/>\n#ifdef FRAGMENT<br \/>\nuniform vec4 _Color;<br \/>\nuniform vec4 _node_4617;<br \/>\nuniform float _node_1057;<br \/>\nvarying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  vec4 tmpvar_1;<br \/>\n  tmpvar_1.w = 1.0;<br \/>\n  tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((<br \/>\n    sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))<br \/>\n   * 11.0) + -10.0)));<br \/>\n  gl_FragData[0] = tmpvar_1;<br \/>\n}<\/p>\n<p>#endif<br \/>\n\"<br \/>\n}<br \/>\nSubProgram \"d3d9 \" {<br \/>\n\/\/ Stats: 5 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" \"VERTEXLIGHT_ON\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\n\"vs_3_0<br \/>\ndcl_position v0<br \/>\ndcl_texcoord v1<br \/>\ndcl_position o0<br \/>\ndcl_texcoord o1.xy<br \/>\ndp4 o0.x, c0, v0<br \/>\ndp4 o0.y, c1, v0<br \/>\ndp4 o0.z, c2, v0<br \/>\ndp4 o0.w, c3, v0<br \/>\nmov o1.xy, v1<\/p>\n<p>\"<br \/>\n}<br \/>\nSubProgram \"d3d11 \" {<br \/>\n\/\/ Stats: 4 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" \"VERTEXLIGHT_ON\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nConstBuffer \"UnityPerDraw\" 336<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\nBindCB  \"UnityPerDraw\" 0<br \/>\n\"vs_4_0<br \/>\nroot12:aaabaaaa<br \/>\neefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa<br \/>\ncmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa<br \/>\naaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl<br \/>\nepfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa<br \/>\naaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa<br \/>\nfdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa<br \/>\neaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa<br \/>\naaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa<br \/>\ngfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa<br \/>\nfgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa<br \/>\negiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak<br \/>\npcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa<br \/>\naaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa<br \/>\naaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa<br \/>\ndoaaaaab\"<br \/>\n}<br \/>\nSubProgram \"opengl \" {<br \/>\n\/\/ Stats: 10 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" \"VERTEXLIGHT_ON\" }<br \/>\n\"!!GLSL#version 120<\/p>\n<p>#ifdef VERTEX<\/p>\n<p>varying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);<br \/>\n  xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;<br \/>\n}<\/p>\n<p>#endif<br \/>\n#ifdef FRAGMENT<br \/>\nuniform vec4 _Color;<br \/>\nuniform vec4 _node_4617;<br \/>\nuniform float _node_1057;<br \/>\nvarying vec2 xlv_TEXCOORD0;<br \/>\nvoid main ()<br \/>\n{<br \/>\n  vec4 tmpvar_1;<br \/>\n  tmpvar_1.w = 1.0;<br \/>\n  tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((<br \/>\n    sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))<br \/>\n   * 11.0) + -10.0)));<br \/>\n  gl_FragData[0] = tmpvar_1;<br \/>\n}<\/p>\n<p>#endif<br \/>\n\"<br \/>\n}<br \/>\nSubProgram \"d3d9 \" {<br \/>\n\/\/ Stats: 5 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" \"VERTEXLIGHT_ON\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\n\"vs_3_0<br \/>\ndcl_position v0<br \/>\ndcl_texcoord v1<br \/>\ndcl_position o0<br \/>\ndcl_texcoord o1.xy<br \/>\ndp4 o0.x, c0, v0<br \/>\ndp4 o0.y, c1, v0<br \/>\ndp4 o0.z, c2, v0<br \/>\ndp4 o0.w, c3, v0<br \/>\nmov o1.xy, v1<\/p>\n<p>\"<br \/>\n}<br \/>\nSubProgram \"d3d11 \" {<br \/>\n\/\/ Stats: 4 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" \"VERTEXLIGHT_ON\" }<br \/>\nBind \"vertex\" Vertex<br \/>\nBind \"texcoord\" TexCoord0<br \/>\nConstBuffer \"UnityPerDraw\" 336<br \/>\nMatrix 0 [glstate_matrix_mvp]<br \/>\nBindCB  \"UnityPerDraw\" 0<br \/>\n\"vs_4_0<br \/>\nroot12:aaabaaaa<br \/>\neefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa<br \/>\ncmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa<br \/>\naaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl<br \/>\nepfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa<br \/>\naaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa<br \/>\nfdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa<br \/>\neaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa<br \/>\naaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa<br \/>\ngfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa<br \/>\nfgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa<br \/>\negiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak<br \/>\npcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa<br \/>\naaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa<br \/>\naaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa<br \/>\ndoaaaaab\"<br \/>\n}<br \/>\n}<br \/>\nProgram \"fp\" {<br \/>\nSubProgram \"opengl \" {<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\n\"!!GLSL\"<br \/>\n}<br \/>\nSubProgram \"d3d9 \" {<br \/>\n\/\/ Stats: 15 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nVector 0 [_Color]<br \/>\nFloat 2 [_node_1057]<br \/>\nVector 1 [_node_4617]<br \/>\n\"ps_3_0<br \/>\ndef c3, 0.200000003, 10, 11, -10<br \/>\ndef c4, 1, 0, 0, 0<br \/>\ndcl_texcoord v0.xy<br \/>\nadd r0.xy, c3, v0<br \/>\npow r1.x, r0.x, c2.x<br \/>\npow r1.y, r0.y, c2.x<br \/>\nadd r0.x, r1.y, r1.x<br \/>\nrsq r0.x, r0.x<br \/>\nrcp r0.x, r0.x<br \/>\nmad r0.x, r0.x, c3.z, c3.w<br \/>\nmov r1.xyz, c1<br \/>\nadd r0.yzw, -r1.xxyz, c0.xxyz<br \/>\nmad oC0.xyz, r0.x, r0.yzww, c1<br \/>\nmov oC0.w, c4.x<\/p>\n<p>\"<br \/>\n}<br \/>\nSubProgram \"d3d11 \" {<br \/>\n\/\/ Stats: 9 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_OFF\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nConstBuffer \"$Globals\" 144<br \/>\nVector 96 [_Color]<br \/>\nVector 112 [_node_4617]<br \/>\nFloat 128 [_node_1057]<br \/>\nBindCB  \"$Globals\" 0<br \/>\n\"ps_4_0<br \/>\nroot12:aaabaaaa<br \/>\neefiecedbabakleflijnjmcmgkldbcbdippjnhehabaaaaaaceacaaaaadaaaaaa<br \/>\ncmaaaaaaieaaaaaaliaaaaaaejfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaa<br \/>\naaaaaaaaabaaaaaaadaaaaaaaaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaabaaaaaaadadaaaafdfgfpfaepfdejfeejepeoaafeeffiedepepfcee<br \/>\naaklklklepfdeheocmaaaaaaabaaaaaaaiaaaaaacaaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaaaaaaaaaapaaaaaafdfgfpfegbhcghgfheaaklklfdeieefcgeabaaaa<br \/>\neaaaaaaafjaaaaaafjaaaaaeegiocaaaaaaaaaaaajaaaaaagcbaaaaddcbabaaa<br \/>\nabaaaaaagfaaaaadpccabaaaaaaaaaaagiaaaaacabaaaaaaaaaaaaakdcaabaaa<br \/>\naaaaaaaaegbabaaaabaaaaaaaceaaaaamnmmemdoaaaacaebaaaaaaaaaaaaaaaa<br \/>\ncpaaaaafdcaabaaaaaaaaaaaegaabaaaaaaaaaaadiaaaaaidcaabaaaaaaaaaaa<br \/>\negaabaaaaaaaaaaaagiacaaaaaaaaaaaaiaaaaaabjaaaaafdcaabaaaaaaaaaaa<br \/>\negaabaaaaaaaaaaaaaaaaaahbcaabaaaaaaaaaaabkaabaaaaaaaaaaaakaabaaa<br \/>\naaaaaaaaelaaaaafbcaabaaaaaaaaaaaakaabaaaaaaaaaaadcaaaaajbcaabaaa<br \/>\naaaaaaaaakaabaaaaaaaaaaaabeaaaaaaaaadaebabeaaaaaaaaacambaaaaaaak<br \/>\nocaabaaaaaaaaaaaagijcaaaaaaaaaaaagaaaaaaagijcaiaebaaaaaaaaaaaaaa<br \/>\nahaaaaaadcaaaaakhccabaaaaaaaaaaaagaabaaaaaaaaaaajgahbaaaaaaaaaaa<br \/>\negiccaaaaaaaaaaaahaaaaaadgaaaaaficcabaaaaaaaaaaaabeaaaaaaaaaiadp<br \/>\ndoaaaaab\"<br \/>\n}<br \/>\nSubProgram \"opengl \" {<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\n\"!!GLSL\"<br \/>\n}<br \/>\nSubProgram \"d3d9 \" {<br \/>\n\/\/ Stats: 15 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nVector 0 [_Color]<br \/>\nFloat 2 [_node_1057]<br \/>\nVector 1 [_node_4617]<br \/>\n\"ps_3_0<br \/>\ndef c3, 0.200000003, 10, 11, -10<br \/>\ndef c4, 1, 0, 0, 0<br \/>\ndcl_texcoord v0.xy<br \/>\nadd r0.xy, c3, v0<br \/>\npow r1.x, r0.x, c2.x<br \/>\npow r1.y, r0.y, c2.x<br \/>\nadd r0.x, r1.y, r1.x<br \/>\nrsq r0.x, r0.x<br \/>\nrcp r0.x, r0.x<br \/>\nmad r0.x, r0.x, c3.z, c3.w<br \/>\nmov r1.xyz, c1<br \/>\nadd r0.yzw, -r1.xxyz, c0.xxyz<br \/>\nmad oC0.xyz, r0.x, r0.yzww, c1<br \/>\nmov oC0.w, c4.x<\/p>\n<p>\"<br \/>\n}<br \/>\nSubProgram \"d3d11 \" {<br \/>\n\/\/ Stats: 9 math<br \/>\nKeywords { \"DIRECTIONAL\" \"SHADOWS_SCREEN\" \"LIGHTMAP_OFF\" \"DIRLIGHTMAP_OFF\" \"DYNAMICLIGHTMAP_OFF\" }<br \/>\nConstBuffer \"$Globals\" 144<br \/>\nVector 96 [_Color]<br \/>\nVector 112 [_node_4617]<br \/>\nFloat 128 [_node_1057]<br \/>\nBindCB  \"$Globals\" 0<br \/>\n\"ps_4_0<br \/>\nroot12:aaabaaaa<br \/>\neefiecedbabakleflijnjmcmgkldbcbdippjnhehabaaaaaaceacaaaaadaaaaaa<br \/>\ncmaaaaaaieaaaaaaliaaaaaaejfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaa<br \/>\naaaaaaaaabaaaaaaadaaaaaaaaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaabaaaaaaadadaaaafdfgfpfaepfdejfeejepeoaafeeffiedepepfcee<br \/>\naaklklklepfdeheocmaaaaaaabaaaaaaaiaaaaaacaaaaaaaaaaaaaaaaaaaaaaa<br \/>\nadaaaaaaaaaaaaaaapaaaaaafdfgfpfegbhcghgfheaaklklfdeieefcgeabaaaa<br \/>\neaaaaaaafjaaaaaafjaaaaaeegiocaaaaaaaaaaaajaaaaaagcbaaaaddcbabaaa<br \/>\nabaaaaaagfaaaaadpccabaaaaaaaaaaagiaaaaacabaaaaaaaaaaaaakdcaabaaa<br \/>\naaaaaaaaegbabaaaabaaaaaaaceaaaaamnmmemdoaaaacaebaaaaaaaaaaaaaaaa<br \/>\ncpaaaaafdcaabaaaaaaaaaaaegaabaaaaaaaaaaadiaaaaaidcaabaaaaaaaaaaa<br \/>\negaabaaaaaaaaaaaagiacaaaaaaaaaaaaiaaaaaabjaaaaafdcaabaaaaaaaaaaa<br \/>\negaabaaaaaaaaaaaaaaaaaahbcaabaaaaaaaaaaabkaabaaaaaaaaaaaakaabaaa<br \/>\naaaaaaaaelaaaaafbcaabaaaaaaaaaaaakaabaaaaaaaaaaadcaaaaajbcaabaaa<br \/>\naaaaaaaaakaabaaaaaaaaaaaabeaaaaaaaaadaebabeaaaaaaaaacambaaaaaaak<br \/>\nocaabaaaaaaaaaaaagijcaaaaaaaaaaaagaaaaaaagijcaiaebaaaaaaaaaaaaaa<br \/>\nahaaaaaadcaaaaakhccabaaaaaaaaaaaagaabaaaaaaaaaaajgahbaaaaaaaaaaa<br \/>\negiccaaaaaaaaaaaahaaaaaadgaaaaaficcabaaaaaaaaaaaabeaaaaaaaaaiadp<br \/>\ndoaaaaab\"<br \/>\n}<br \/>\n}<br \/>\n }<br \/>\n}<br \/>\nFallback \"Diffuse\"<br \/>\n}<\/code><\/p>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.feedingedge.co.uk%2Fblog%2F2015%2F10%2F19%2Fshady-maths-for-shaders%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80\" scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:450px; height:80px;\" allowTransparency=\"true\"><\/iframe><div name=\"googleone_share_1\" style=\"position:relative;z-index:5;float: right; margin-left: 10px;\"><g:plusone size=\"tall\" count=\"1\" href=\"https:\/\/www.feedingedge.co.uk\/blog\/2015\/10\/19\/shady-maths-for-shaders\/\"><\/g:plusone><\/div>","protected":false},"excerpt":{"rendered":"<p>I like a good tech challenge and I decided to look a bit more into the world of shaders. I had not fully appreciated how many competing languages there were for these low level compute systems. I had used shaders in Unity3D and I knew we could do fancy things with them. They are wonderfully<br \/>\n            <span class=\"excerpt-readmore\"><a class=\"more-link\" href=\"https:\/\/www.feedingedge.co.uk\/blog\/2015\/10\/19\/shady-maths-for-shaders\/\"><\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[60,232],"tags":[],"class_list":["post-2618","post","type-post","status-publish","format-standard","hentry","category-code","category-technical"],"_links":{"self":[{"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/posts\/2618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=2618"}],"version-history":[{"count":2,"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/posts\/2618\/revisions"}],"predecessor-version":[{"id":2620,"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/posts\/2618\/revisions\/2620"}],"wp:attachment":[{"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=2618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=2618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.feedingedge.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=2618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}