如何获得 godot 空间着色器的分辨率?

How to get the resolution on godot spatial shader?

shader_type spatial;
void fragment ()

{
    vec2 i_resolution = 1.0 / SCREEN_PIXEL_SIZE ;

    ...
    //fragColor = ...; 
    COLOR = ...; 'Constants cannot be modified' And this is other problem on spatial shader
}

SCREEN_PIXEL_SIZE 空间着色器不起作用?如何获取分辨率?

如您所见,SCREEN_PIXEL_SIZE 不存在于空间着色器中(它存在于 Canvas 着色器中)。

空间着色器的 SCREEN_PIXEL_SIZE 相当于 1.0/VIEWPORT_SIZE。即VIEWPORT_SIZE = 1.0/SCREEN_PIXEL_SIZE.

既然1.0/SCREEN_PIXEL_SIZE是你想要的,那么直接用VIEWPORT_SIZE就可以了。它为您提供视口的大小(以像素为单位)(绘制着色器的位置,无论是屏幕、window 还是纹理)。

此外,如果你打算做FRAGCOORD.xy/VIEWPORT_SIZE,你可以使用SCREEN_UV代替。即SCREEN_UV = FRAGCOORD.xy/VIEWPORT_SIZE。如您所料,FRAGCOORD 是以像素为单位的片段坐标,而 SCREEN_UV 为您提供归一化坐标(0 到 1)。

顺便说一句,如果你不想 material 取决于屏幕上的位置,你可以将 SCREEN_UV 换成 UV

顺便说一下,我知道 SCREEN_UV 说的是“屏幕”而不是“视口”。有些命名可能会造成混淆。


在您的空间着色器中,您不写入 COLOR,而是写入 ALBEDOALPHA。 Godot 会注意到您是否写入 ALPHA,并在决定渲染顺序时考虑到这一点(因此可能透明的 material 会在不透明的 material 之后渲染)。


说到令人困惑的命名……

mat4 ModelToWorld  = WORLD_MATRIX;              // Common name: Model Matrix
mat4 WorldToModel  = inverse(WORLD_MATRIX);     // Common name: Inverse Model Matrix
mat4 WorldToCamera = INV_CAMERA_MATRIX;         // Common name: View Matrix
mat4 CameraToWorld = CAMERA_MATRIX;             // Common name: Inverse View Matrix
mat4 ModelToCamera = MODELVIEW_MATRIX;          // Common name: View Model Matrix
mat4 CameraToModel = inverse(MODELVIEW_MATRIX); // Common name: Inverse View Model Matrix
mat4 CameraToClip  = PROJECTION_MATRIX;          // Common name: Projection Matrix
mat4 ClipToCamera  = INV_PROJECTION_MATRIX;      // Common name: Inverse Projection Matrix

请参阅Spatial Shaders,了解内置插件(包括上面提到的那些)和渲染模式的列表。