Shaders

Introducción

Shaders are unique programs that run on the GPU. They are used to specify how to take mesh data (vertex positions, colors, normals, etc.) and draw them to the screen. Shaders do not process information the same way a normal program does because they are optimized for running on the GPU. One consequence of this is that shaders do not retain their data after they run; they output a final color to the screen and then move on. Accordingly, there is no way of accessing the color output from the last run of the shader.

Godot uses a shader language very similar to GLSL, but with added functionality and slightly less flexibility. The reason for doing this is that Godot integrates built-in functionality to make writing complex shaders substantially easier. Godot wraps the user-written shader code in code of its own. That way, Godot handles a lot of the low-level stuff that the user doesn’t need to worry about, and it is able to parse your shader code and use it to affect the rendering pipeline. For more advanced shaders, you can turn this functionality off using a render_mode.

This document provides you with some information about shaders, specific to Godot. For a detailed reference of the shading language in Godot see the Godot shading language doc.

Tipos de Shaders

En lugar de ofrecer una configuración de propósito general (2D, 3D, partículas), los shaders de Godot deben especificar para qué serán usadas. Diferentes tipos soportan distintos modos de renderizado, variables integradas y funciones de procesamiento.

Todos los shaders deben especificar el tipo en la primera línea, en el siguiente formato:

shader_type spatial;

Los tipos válidos son:

For detailed information on each shading type, see the corresponding reference document.

Modos de renderizado

Los distintos tipos de shaders soportan diferentes modos de renderizado. Son opcionales pero, si se especifican, debe hacerse después del shader_type. Estos modos son usados para alterar la forma en que la funcionalidad integrada es manejada. Por ejemplo, es común usar el modo unshaded para saltearse la función de procesamiento de iluminación (light).

Render modes are specified underneath the shader type:

shader_type spatial;
render_mode unshaded, cull_disabled;

Each shader type has a different list of render modes available. See the document for each shader type for a complete list of render modes.

Funciones de procesamiento

Dependiendo del tipo de shader, distintas funciones de procesamiento estarán disponibles para sobreescribir. Para «spatial» y «canvas_item», es posible utilizar vertex, fragment y light. Para «particles» sólo está disponible vertex.

Procesador Vertex

La función de procesamiento vertex es llamada por cada vértice en shaders «spatial» y «canvas_item». Para «particles», es llamada por cada partícula.

The vertex function is used to modify per-vertex information that will be passed on to the fragment function. It can also be used to establish variables that will be sent to the fragment function by using varyings(see other doc).

By default, Godot will take your vertex information and transform it accordingly to be drawn. If this is undesirable, you can use render modes to transform the data yourself; see the Spatial shader doc for an example of this.

Procesador Fragment

El procesador fragment es usado para asignar parámetros de materiales por pixel. Este código es ejecutado por cada pixel visible que es dibujado en el objeto o primitiva. Sólo está disponible en shaders «spatial» y «canvas_item».

The standard use of the fragment function is to set up material properties that will be used to calculate lighting. For example, you would set values for ROUGHNESS, RIM, or TRANSMISSION which would tell the light function how the lights respond to that fragment. This makes it possible to control a complex shading pipeline without the user having to write much code. If you don’t need this built-in functionality, you can ignore it and write your own light processing function and Godot will optimize it away. For example, if you do not write a value to RIM, Godot will not calculate rim lighting. During compilation, Godot checks to see if RIM is used; if not, it cuts all the corresponding code out. Therefore, you will not waste calculations on effects that you do not use.

Procesador Light

El procesador «light» se ejecuta también por pixel, pero además es ejecutado por cada luz que afecta el objeto (y no es ejecutada si no hay luces afectando el objeto). Existe como una función llamada dentro de fragment y típicamente opera sobre las propiedades de los materiales configuradas dentro de la función fragment.

The light processor works differently in 2D than it does in 3D; for a description of how it works in each, see their documentation, CanvasItem shaders and Spatial shaders, respectively.