<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chetan Sharma</title>
    <description>The latest articles on DEV Community by Chetan Sharma (@chetancode).</description>
    <link>https://dev.to/chetancode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F776714%2F129700fa-17b5-491f-bd8e-e6f1f9f67c6d.jpg</url>
      <title>DEV Community: Chetan Sharma</title>
      <link>https://dev.to/chetancode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chetancode"/>
    <language>en</language>
    <item>
      <title>Introduction to Shader Coding [for beginners]</title>
      <dc:creator>Chetan Sharma</dc:creator>
      <pubDate>Thu, 03 Feb 2022 11:14:55 +0000</pubDate>
      <link>https://dev.to/chetancode/introduction-to-shader-coding-in-unity-for-beginners-4m5f</link>
      <guid>https://dev.to/chetancode/introduction-to-shader-coding-in-unity-for-beginners-4m5f</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;What is a Shader?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Code that runs on GPU.&lt;/p&gt;

&lt;p&gt;In Unity, shader programs are written in a variant of &lt;a href="https://en.wikipedia.org/wiki/High-Level_Shading_Language"&gt;HLSL&lt;/a&gt; language (also called &lt;a href="https://en.wikipedia.org/wiki/Cg_%28programming_language%29"&gt;Cg&lt;/a&gt; but for most practical uses the two are the same)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In computer graphics, a shader is a type of computer program originally used for shading in 3D scenes (the production of appropriate levels of light, darkness, and color in a rendered image). They now perform a variety of specialized functions in various fields within the category of computer graphics special effects, or else do video post-processing unrelated to shading, or even perform functions unrelated to graphics.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Shader vs Material&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;The material gives input/parameters to shaders.&lt;/p&gt;

&lt;p&gt;Shader works on those inputs.&lt;/p&gt;

&lt;p&gt;Different materials can share the same shader with different properties(inputs to shaders).&lt;/p&gt;

&lt;p&gt;Object refers to material, material refers to a shader. (in Unity)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DY2XTvLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x6srq7iy2eb4bibfyurx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DY2XTvLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x6srq7iy2eb4bibfyurx.png" alt="Image description" width="880" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Types of Shaders&lt;/strong&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Vertex Shader&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Each mesh is made up of a bunch of vertices arranged in a 3d space.&lt;/p&gt;

&lt;p&gt;A vertex shader takes into account the properties/data associated with these vertices to perform any operation on them.&lt;/p&gt;

&lt;p&gt;The most important work of vertex shader is vertex transformation — the first stage in graphics pipeline — it transforms the vertex position(local space position) into screen position — which later goes through rasterization for other operations.&lt;/p&gt;

&lt;p&gt;For example, if you want the mesh to deform at random vertices — you can do that with a vertex shader.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ejPflaeg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6be8bc6vk7916fdmlvda.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ejPflaeg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6be8bc6vk7916fdmlvda.jpeg" alt="Image description" width="500" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Fragment/Pixel Shader&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;A frag and pixel are technically two different things but we can now just imagine them to be the same/related for better understanding.&lt;/p&gt;

&lt;p&gt;Just like a mesh is made up of many vertices — these vertices are joined together to form triangles/polygons — a fag shader works on the frag/pixels in the area between the vertices forming the triangles.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The rasterization process breaks up each geometric primitive, such as a triangle, into pixel-sized fragments for each pixel that the primitive covers. A fragment has an associated pixel location, a depth value, and a set of interpolated parameters such as a color, a secondary (specular) color, and one or more texture coordinate sets.(Source : nvidia cg tutorials)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TfC2WGbA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1i4b5512jf75kraimnyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TfC2WGbA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1i4b5512jf75kraimnyx.png" alt="Image description" width="770" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A frag shader works on these fragments formed during the rasterization process.&lt;/p&gt;

&lt;p&gt;Thus a frag shader may work on the output from the vertex shader to attach a color to each pixel/frag of the area of the polygons forming the mesh.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CS_1gMtA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygllglyaefdagi24tfpn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CS_1gMtA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygllglyaefdagi24tfpn.jpg" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Creating a basic Unlit Shader in Unity&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Right-click anywhere in the Project panel to create a new Unlit Shader (Name it whatever you want — I am calling it “SimpleShader”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OC2N1HKu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrjpsfpqle4dvypqc2kd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OC2N1HKu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrjpsfpqle4dvypqc2kd.png" alt="Image description" width="806" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right-click the new shader file and create material out of it. (Name it whatever you like — I am calling it “SimpleMaterial”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3udK9Hn9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhxxs8ocuwwhnhskn7ve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3udK9Hn9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhxxs8ocuwwhnhskn7ve.png" alt="Image description" width="698" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create any primitive shape (3d cube, sphere, etc) and drag and drop the material (SimpleMaterial) on the 3d Gameobjects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DOYg7wSx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3omw33bxttrk3unn73lr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DOYg7wSx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3omw33bxttrk3unn73lr.png" alt="Image description" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now click the SimpleShader file to open it in Visual Studio :&lt;/p&gt;

&lt;p&gt;you will see something like this (&lt;strong&gt;&lt;em&gt;just go through it — you don’t need to understand anything&lt;/em&gt;&lt;/strong&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Shader&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unlit/SimpleShader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Properties&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;_MainTex&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Texture&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;SubShader&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Tags&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RenderType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Opaque&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;LOD&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;

        &lt;span class="nx"&gt;Pass&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;CGPROGRAM&lt;/span&gt;
            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="nx"&gt;vert&lt;/span&gt;
            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&gt;fragment&lt;/span&gt; &lt;span class="nx"&gt;frag&lt;/span&gt;
            &lt;span class="c1"&gt;// make fog work&lt;/span&gt;
            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&gt;multi_compile_fog&lt;/span&gt;

            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;include&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UnityCG.cginc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

            &lt;span class="nx"&gt;struct&lt;/span&gt; &lt;span class="nx"&gt;appdata&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;float4&lt;/span&gt; &lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;POSITION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;float2&lt;/span&gt; &lt;span class="nx"&gt;uv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TEXCOORD0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="nx"&gt;struct&lt;/span&gt; &lt;span class="nx"&gt;v2f&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;float2&lt;/span&gt; &lt;span class="nx"&gt;uv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TEXCOORD0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;UNITY_FOG_COORDS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nx"&gt;float4&lt;/span&gt; &lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SV_POSITION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="nx"&gt;sampler2D&lt;/span&gt; &lt;span class="nx"&gt;_MainTex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;float4&lt;/span&gt; &lt;span class="nx"&gt;_MainTex_ST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="nx"&gt;v2f&lt;/span&gt; &lt;span class="nx"&gt;vert&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appdata&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                &lt;span class="nx"&gt;v2f&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UnityObjectToClipPos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;TRANSFORM_TEX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_MainTex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nx"&gt;UNITY_TRANSFER_FOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="nx"&gt;fixed4&lt;/span&gt; &lt;span class="nx"&gt;frag&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v2f&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SV_Target&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// sample the texture&lt;/span&gt;
                &lt;span class="nx"&gt;fixed4&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tex2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_MainTex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="c1"&gt;// apply fog&lt;/span&gt;
                &lt;span class="nx"&gt;UNITY_APPLY_FOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fogCoord&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;ENDCG&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code has a lot of template code — that we are not gonna use for now — so I have removed all the code related to UnityFog and Properties — after removal and some changes your shader will look like this&lt;/p&gt;

&lt;p&gt;(&lt;strong&gt;Read the comments carefully&lt;/strong&gt;) — you can &lt;em&gt;copy-paste&lt;/em&gt; this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Shader&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unlit/SimpleShader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="c1"&gt;//heirachy and name of shader file&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;//this properties will appear in the unity inspectors such as textures &lt;/span&gt;
     &lt;span class="c1"&gt;//colors etc - you can use them in main shader code &lt;/span&gt;
    &lt;span class="nx"&gt;Properties&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//main shader code begins here&lt;/span&gt;
    &lt;span class="nx"&gt;SubShader&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Tags&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RenderType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Opaque&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;Pass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;CGPROGRAM&lt;/span&gt;
            &lt;span class="c1"&gt;//we define the vert(vertex shader) and frag(fragment shader)&lt;/span&gt;
            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="nx"&gt;vert&lt;/span&gt; &lt;span class="c1"&gt;//this is our vertex shader&lt;/span&gt;
            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&gt;fragment&lt;/span&gt; &lt;span class="nx"&gt;frag&lt;/span&gt; &lt;span class="c1"&gt;//this is our fragment shader&lt;/span&gt;

            &lt;span class="c1"&gt;//we include a unitycg library code - which has a lot of functions&lt;/span&gt;
            &lt;span class="c1"&gt;//which will help us&lt;/span&gt;
            &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;include&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UnityCG.cginc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

            &lt;span class="c1"&gt;//input to vertex shader&lt;/span&gt;
            &lt;span class="nx"&gt;struct&lt;/span&gt; &lt;span class="nx"&gt;appdata&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;float4&lt;/span&gt; &lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;POSITION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//positon of vertex from the mesh&lt;/span&gt;
                &lt;span class="nx"&gt;float2&lt;/span&gt; &lt;span class="nx"&gt;uv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TEXCOORD0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//uv coordinates&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="c1"&gt;//output of vertex Shader&lt;/span&gt;
            &lt;span class="nx"&gt;struct&lt;/span&gt; &lt;span class="nx"&gt;v2f&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;float4&lt;/span&gt; &lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SV_POSITION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;


            &lt;span class="c1"&gt;//main vertex shader code&lt;/span&gt;
            &lt;span class="nx"&gt;v2f&lt;/span&gt; &lt;span class="nx"&gt;vert&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appdata&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                &lt;span class="nx"&gt;v2f&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="c1"&gt;//converting object vertex position to clip position (we have to do this kinda                            compulsary)&lt;/span&gt;
               &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vertex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UnityObjectToClipPos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
               &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;//we can declare properties if we want to use them in shader code (name should remain same                  as that in Properties block)                        &lt;/span&gt;
            &lt;span class="c1"&gt;//main fragment shader &lt;/span&gt;
            &lt;span class="c1"&gt;//changed return values from fixed4 to float4&lt;/span&gt;
            &lt;span class="nx"&gt;float4&lt;/span&gt; &lt;span class="nx"&gt;frag&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v2f&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SV_Target&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;//We are not using textures any more so just returned &lt;/span&gt;
            &lt;span class="c1"&gt;//a basic white color (Red 1, Green 1 , Blue 1, Alpha 0)&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;float4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;ENDCG&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;What are POSITION, TEXCOORD0, SV_POSITION , SV_Target ?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;These are called Semantics.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A semantic is a string attached to a shader input or output that conveys information about the intended use of a parameter. Semantics are required on all variables passed between shader stages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thus we can say using semantics can help to decouple the shaders.&lt;/p&gt;

&lt;p&gt;An obvious benefit of semantics, you don’t need the same variable names between stages, so the Graphics pipeline does matching via semantics instead of the variable name, and rearranges data as long as you have a compatible layout.&lt;/p&gt;

&lt;p&gt;They are just a standard developed by few companies and you will slowly learn all semantics as you start making shaders.&lt;/p&gt;

&lt;p&gt;If you want to learn more about semantics: &lt;a href="https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics"&gt;Semantics Microsoft Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So if we have to write pseudo code for an unlit shader it will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Shader&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unlit/SimpleShader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;Properties&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//Properties we want to provide to shader through unity inspector&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;SubShader&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;Tags&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//some tags }&lt;/span&gt;
  &lt;span class="nx"&gt;Pass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//we define the vert(vertex shader) and frag(fragment shader) with #pragma&lt;/span&gt;
&lt;span class="c1"&gt;//input to vertex shader -&amp;gt; appdata&lt;/span&gt;
&lt;span class="c1"&gt;//output of vertex Shader -&amp;gt; v2f&lt;/span&gt;
&lt;span class="c1"&gt;//main vertex shader code  -&amp;gt;  vert&lt;/span&gt;
&lt;span class="c1"&gt;//we need to declare again the properties(with same name) if we want to use it in main shader code&lt;/span&gt;
&lt;span class="c1"&gt;//main fragment shader  code -&amp;gt; frag&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion :&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Shader code runs on GPU.&lt;/li&gt;
&lt;li&gt;Two main types of shaders are vertex and frag shader.&lt;/li&gt;
&lt;li&gt;Vertex shader works on vertices of mesh data and frag colors the pixels(frag)&lt;/li&gt;
&lt;li&gt;In a simple unlit shader, we pass data from appdata(Vextex Inputs) to vert (main vertex shader code) which make changes and assign values to v2f (vertex outputs for frag shader)&lt;/li&gt;
&lt;li&gt;Frag shader uses input form v2f to color/shade or make any change and return final output in (RGBA) form.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Chw504U8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1cje6mqkmtf65q8zoe5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Chw504U8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1cje6mqkmtf65q8zoe5v.png" alt="Image description" width="880" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m still learning about shader coding.&lt;/p&gt;

&lt;p&gt;For more details - you can follow this amazing tutorial by &lt;a href="https://www.youtube.com/channel/UC7M-Wz4zK8oikt6ATcoTwBA"&gt;Freya Holmér&lt;/a&gt; on Youtube :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/kfM-yu0iQBk"&gt;https://youtu.be/kfM-yu0iQBk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>shader</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Unity Game Dev Resources - that helped me - publish my own games !</title>
      <dc:creator>Chetan Sharma</dc:creator>
      <pubDate>Fri, 28 Jan 2022 11:11:42 +0000</pubDate>
      <link>https://dev.to/chetancode/unity-game-dev-resources-that-helped-publish-my-own-games--322g</link>
      <guid>https://dev.to/chetancode/unity-game-dev-resources-that-helped-publish-my-own-games--322g</guid>
      <description>&lt;h2&gt;
  
  
  Math/Tools/Shaders/Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/c/Acegikmo"&gt;https://www.youtube.com/c/Acegikmo&lt;/a&gt; (detailed shader math and programming tuts)&lt;br&gt;
&lt;a href="https://gamemath.com/book/intro.html"&gt;https://gamemath.com/book/intro.html&lt;/a&gt; (book)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/GameDevGuide"&gt;https://www.youtube.com/c/GameDevGuide&lt;/a&gt; (tools/systems)&lt;br&gt;
&lt;a href="https://www.catlikecoding.com/unity/tutorials/"&gt;https://www.catlikecoding.com/unity/tutorials/&lt;/a&gt; (may be old but still most info is relevant)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/SebastianLague"&gt;https://www.youtube.com/c/SebastianLague&lt;/a&gt; (some art math heavy)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/Roundbeargames"&gt;https://www.youtube.com/c/Roundbeargames&lt;/a&gt; (C++ tutorials for unity users - explaining basic concepts of programming)&lt;br&gt;
youtube.com/c/Unity3dCollege/videos (code and game design)&lt;br&gt;
&lt;a href="https://gameprogrammingpatterns.com/contents.html"&gt;https://gameprogrammingpatterns.com/contents.html&lt;/a&gt; (programming patterns book)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/SharpAccent/videos"&gt;https://www.youtube.com/c/SharpAccent/videos&lt;/a&gt; (intermediate to advance tutorials 3d)&lt;/p&gt;

&lt;h2&gt;
  
  
  2D/General Understanding of Unity/Basic Game Mechanics:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/c/Blackthornprod/videos"&gt;https://www.youtube.com/c/Blackthornprod/videos&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/c/JonasTyroller/videos"&gt;https://www.youtube.com/c/JonasTyroller/videos&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.youtube.com/user/Brackeys"&gt;https://www.youtube.com/user/Brackeys&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/c/JimmyVegasUnity/videos"&gt;https://www.youtube.com/c/JimmyVegasUnity/videos&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/c/Tarodev"&gt;https://www.youtube.com/c/Tarodev&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.youtube.com/c/EpitomeGames/videos"&gt;https://www.youtube.com/c/EpitomeGames/videos&lt;/a&gt; (new multiplayer courses)&lt;/p&gt;

&lt;h2&gt;
  
  
  Computer Graphics/Game Engine :
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gabrielgambetta.com/computer-graphics-from-scratch/"&gt;https://gabrielgambetta.com/computer-graphics-from-scratch/&lt;/a&gt; (book)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/TheChernoProject/videos"&gt;https://www.youtube.com/c/TheChernoProject/videos&lt;/a&gt; (game engine)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/javidx9/videos"&gt;https://www.youtube.com/c/javidx9/videos&lt;/a&gt; (engine code)&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiplayer :
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/document/d/1ufcl6_ylbzthfmzzZ7HPiwDLR0sr1N3UAunUG9rnisY/edit#heading=h.ch4goz9wecxs"&gt;https://docs.google.com/document/d/1ufcl6_ylbzthfmzzZ7HPiwDLR0sr1N3UAunUG9rnisY/edit#heading=h.ch4goz9wecxs&lt;/a&gt; (Unity Networking Frameworks - Feature List (available multiplayer solution comparison))&lt;br&gt;
&lt;a href="https://www.youtube.com/c/DapperDinoCodingTutorials/playlists"&gt;https://www.youtube.com/c/DapperDinoCodingTutorials/playlists&lt;/a&gt; (Mirror and Playfab)&lt;br&gt;
&lt;a href="https://www.youtube.com/c/FirstGearGames/videos"&gt;https://www.youtube.com/c/FirstGearGames/videos&lt;/a&gt; (mirror with js server)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I post such resources and unity related tips from time to time.&lt;br&gt;
You can follow me on twitter : &lt;a href="https://twitter.com/lifecodegames"&gt;https://twitter.com/lifecodegames&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>csharp</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
