Bird
Raised Fist0
Unityframework~5 mins

Custom shader fundamentals in Unity - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a shader in Unity?
A shader in Unity is a small program that tells the computer how to draw something on the screen, controlling the color, lighting, and texture of objects.
Click to reveal answer
beginner
What are the two main types of shaders in Unity?
The two main types are Vertex Shaders, which handle the position of vertices, and Fragment (or Pixel) Shaders, which handle the color of each pixel.
Click to reveal answer
beginner
What is the purpose of the 'Properties' block in a Unity shader?
The 'Properties' block defines variables like colors or textures that you can change in the Unity Editor without editing the shader code.
Click to reveal answer
intermediate
Explain the role of the 'SubShader' in a Unity shader.
A 'SubShader' contains the actual shader code that runs on the GPU. Unity can have multiple SubShaders to support different hardware or rendering paths.
Click to reveal answer
intermediate
What is the difference between a Surface Shader and a Vertex/Fragment Shader in Unity?
Surface Shaders are easier to write and handle lighting automatically, while Vertex/Fragment Shaders give you full control but require more code to manage lighting and effects.
Click to reveal answer
Which part of a Unity shader controls the color of each pixel?
ASubShader
BVertex Shader
CFragment Shader
DProperties Block
What does the 'Properties' block in a Unity shader allow you to do?
AControl vertex positions
BWrite GPU code
CDefine lighting models
DChange shader variables in the Unity Editor
Why might you use multiple SubShaders in a Unity shader?
ATo support different hardware or rendering paths
BTo add more colors
CTo increase texture size
DTo speed up the CPU
Which shader type in Unity automatically handles lighting for you?
ASurface Shader
BVertex/Fragment Shader
CCompute Shader
DGeometry Shader
What is the main role of a Vertex Shader?
ATo set pixel colors
BTo calculate the position of vertices
CTo define textures
DTo manage lighting
Describe the basic structure of a custom shader in Unity and the role of each part.
Think about how you set variables, write GPU code, and control drawing.
You got /5 concepts.
    Explain the difference between Surface Shaders and Vertex/Fragment Shaders and when you might choose each.
    Consider how much control you want versus how much work you want to do.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of a custom shader in Unity?
      easy
      A. To control exactly how objects look by writing small programs
      B. To create 3D models from scratch
      C. To write game logic and rules
      D. To manage user input events

      Solution

      1. Step 1: Understand the role of shaders

        Shaders define how surfaces appear by controlling colors, lighting, and textures.
      2. Step 2: Identify what custom shaders do

        Custom shaders let you write small programs to control object appearance beyond built-in options.
      3. Final Answer:

        To control exactly how objects look by writing small programs -> Option A
      4. Quick Check:

        Custom shader = control object look [OK]
      Hint: Shaders control object appearance with code [OK]
      Common Mistakes:
      • Confusing shaders with 3D modeling
      • Thinking shaders handle game logic
      • Assuming shaders manage input
      2. Which of the following is the correct way to start a simple Unity shader code block?
      easy
      A. ShaderBegin
      B. StartShader
      C. CGPROGRAM
      D. ProgramCG

      Solution

      1. Step 1: Recall Unity shader syntax

        Unity shaders use CGPROGRAM to start the programmable shader code block.
      2. Step 2: Check options for correct keyword

        Only CGPROGRAM is the valid keyword to begin the shader code section.
      3. Final Answer:

        CGPROGRAM -> Option C
      4. Quick Check:

        Shader code block starts with CGPROGRAM [OK]
      Hint: Look for CGPROGRAM to start shader code [OK]
      Common Mistakes:
      • Using made-up keywords like StartShader
      • Confusing CGPROGRAM with other terms
      • Misspelling the keyword
      3. What will be the output color of this simple shader fragment code?
      fixed4 frag() : SV_Target {
          return fixed4(1, 0, 0, 1);
      }
      medium
      A. Solid red color
      B. Solid green color
      C. Solid blue color
      D. Transparent black color

      Solution

      1. Step 1: Analyze the returned color vector

        The function returns fixed4(1, 0, 0, 1), which means red=1, green=0, blue=0, alpha=1.
      2. Step 2: Interpret color components

        Red is full intensity, green and blue are zero, alpha is fully opaque.
      3. Final Answer:

        Solid red color -> Option A
      4. Quick Check:

        fixed4(1,0,0,1) = red [OK]
      Hint: RGBA (1,0,0,1) means solid red [OK]
      Common Mistakes:
      • Mixing up color channel order
      • Ignoring alpha channel
      • Assuming zero means white
      4. Identify the error in this shader snippet:
      Shader "Custom/Simple" {
          Properties {
              _Color ("Color", Color) = (1,1,1,1)
          }
          SubShader {
              Pass {
                  CGPROGRAM
                  fixed4 frag() : SV_Target {
                      return _Color;
                  }
                  ENDCG
              }
          }
      }
      medium
      A. Missing semicolon after _Color property declaration
      B. _Color cannot be used directly in fragment shader
      C. frag function missing input parameters
      D. Incorrect use of ENDCG keyword

      Solution

      1. Step 1: Check Properties block syntax

        The property declaration is correct: no semicolon needed, parentheses balanced.
      2. Step 2: Verify shader code block

        Properties like _Color must be declared inside CGPROGRAM as 'uniform fixed4 _Color;' to be used; direct use causes undeclared identifier error.
      3. Final Answer:

        _Color cannot be used directly in fragment shader -> Option B
      4. Quick Check:

        Properties need uniform declaration [OK]
      Hint: Declare Properties as uniforms in CGPROGRAM [OK]
      Common Mistakes:
      • Assuming semicolons are needed in Properties
      • Not declaring uniform for _Color
      • Thinking ENDCG is incorrect
      5. You want to write a custom shader that colors an object red only if its x-coordinate is positive, otherwise blue. Which fragment shader code correctly implements this?
      hard
      A. fixed4 frag() : SV_Target { if (POSITION.x > 0) return fixed4(1,0,0,1); else return fixed4(0,0,1,1); }
      B. fixed4 frag(float3 pos) : SV_Target { if (pos.x > 0) return fixed4(1,0,0,1); else return fixed4(0,0,1,1); }
      C. fixed4 frag(float3 pos : TEXCOORD0) : SV_Target { return pos.x > 0 ? fixed4(1,0,0,1) : fixed4(0,0,1,1); }
      D. fixed4 frag(float3 pos : POSITION) : SV_Target { return pos.x > 0 ? fixed4(1,0,0,1) : fixed4(0,0,1,1); }

      Solution

      1. Step 1: Understand input semantics

        To access vertex position in fragment shader, use input parameter with semantic POSITION.
      2. Step 2: Check code correctness

        fixed4 frag(float3 pos : POSITION) : SV_Target { return pos.x > 0 ? fixed4(1,0,0,1) : fixed4(0,0,1,1); } correctly declares pos with POSITION semantic and uses conditional operator to return red or blue.
      3. Step 3: Identify errors in other options

        fixed4 frag(float3 pos) : SV_Target { if (pos.x > 0) return fixed4(1,0,0,1); else return fixed4(0,0,1,1); } lacks semantic, fixed4 frag(float3 pos : TEXCOORD0) : SV_Target { return pos.x > 0 ? fixed4(1,0,0,1) : fixed4(0,0,1,1); } uses TEXCOORD0 which is wrong for position, fixed4 frag() : SV_Target { if (POSITION.x > 0) return fixed4(1,0,0,1); else return fixed4(0,0,1,1); } uses POSITION as variable incorrectly.
      4. Final Answer:

        fixed4 frag(float3 pos : POSITION) : SV_Target { return pos.x > 0 ? fixed4(1,0,0,1) : fixed4(0,0,1,1); } -> Option D
      5. Quick Check:

        Use POSITION semantic for position input [OK]
      Hint: Use POSITION semantic to get vertex position [OK]
      Common Mistakes:
      • Missing POSITION semantic in input
      • Using wrong semantic like TEXCOORD0
      • Referencing POSITION as variable directly
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard