.. _doc_introduction_to_shaders: Introduction to shaders ======================= This page explains what shaders are and will give you an overview of how they work in Godot. For a detailed reference of the engine's shading language, see `doc_shading_language`. Shaders are a special kind of program that runs on Graphics Processing Units (GPUs). They were initially used to shade 3D scenes but can nowadays do much more. You can use them to control how the engine draws geometry and pixels on the screen, allowing you to achieve all sorts of effects. Modern rendering engines like Godot draw everything with shaders: graphics cards can run thousands of instructions in parallel, leading to incredible rendering speed. Because of their parallel nature, though, shaders don't process information the way a typical program does. Shader code runs on each vertex or pixel in isolation. You cannot store data between frames either. As a result, when working with shaders, you need to code and think differently from other programming languages. Suppose you want to update all the pixels in a texture to a given color. In GDScript, your code would use `for` loops:: for x in range(width): for y in range(height): set_color(x, y, some_color) Your code is already part of a loop in a shader, so the corresponding code would look like this. .. code-block:: glsl void fragment() { COLOR = some_color; } .. note:: The graphics card calls the `fragment()` function once or more for each pixel it has to draw. More on that below. Shaders in Godot ---------------- Godot provides a shading language based on the popular OpenGL Shading Language (GLSL) but simplified. The engine handles some of the lower-level initialization work for you, making it easier to write complex shaders. In Godot, shaders are made up of three main functions: `vertex()`, `fragment()`, and `light()`. 1. The `vertex()` function runs over all the vertices in the mesh and sets their positions and some other per-vertex variables. 2. The `fragment()` function runs for every pixel covered by the mesh. It uses values output by the `vertex()` function, interpolated between the vertices. 3. The `light()` function runs for every pixel and for every light. It takes variables from the `fragment()` function and from its previous runs. .. warning:: The `light()` function won't run if the `vertex_lighting` render mode is enabled, or if **Rendering > Quality > Shading > Force Vertex Shading** is enabled in the Project Settings. It's enabled by default on mobile platforms. Shader types ------------ Instead of supplying a general-purpose configuration for all uses (2D, 3D, particles), you must specify the type of shader you're writing. Different types support different render modes, built-in variables, and processing functions. In Godot, all shaders need to specify their type in the first line, like so: .. code-block:: glsl shader_type spatial; Here are the available types: * `spatial