如何获得 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
,而是写入 ALBEDO
和 ALPHA
。 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,了解内置插件(包括上面提到的那些)和渲染模式的列表。
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
,而是写入 ALBEDO
和 ALPHA
。 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,了解内置插件(包括上面提到的那些)和渲染模式的列表。