Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
使用计算着色器¶
This tutorial will walk you through the process of creating a minimal compute shader. But first, a bit of background on compute shaders and how they work with Godot.
备注
This tutorial assumes you are familiar with shaders generally. If you are new to shaders please read 着色器简介 and your first shader before proceeding with this tutorial.
A compute shader is a special type of shader program that is orientated towards general purpose programming. In other words, they are more flexible than vertex shaders and fragment shaders as they don't have a fixed purpose (i.e. transforming vertices or writing colors to an image). Unlike fragment shaders and vertex shaders, compute shaders have very little going on behind the scenes. The code you write is what the GPU runs and very little else. This can make them a very useful tool to offload heavy calculations to the GPU.
Now let's get started by creating a short compute shader.
First, in the external text editor of your choice, create a new file called
compute_example.glsl
in your project folder. When you write compute shaders
in Godot, you write them in GLSL directly. The Godot shader language is based on
GLSL. If you are familiar with normal shaders in Godot, the syntax below will
look somewhat familiar.
备注
Compute shaders can only be used from RenderingDevice-based renderers (the Forward+ or Mobile renderer). To follow along with this tutorial, ensure that you are using the Forward+ or Mobile renderer. The setting for which is located in the top right-hand corner of the editor.
Note that compute shader support is generally poor on mobile devices (due to driver bugs), even if they are technically supported.
我们把它调成蓝色:
#[compute]
#version 450
// Invocations in the (x, y, z) dimension
layout(local_size_x = 2, local_size_y = 1, local_size_z = 1) in;
// A binding to the buf