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
。它为您提供视口(viewport)(绘制着色器的位置,无论是屏幕、窗口还是纹理)的像素大小。
此外,如果您要执行FRAGCOORD.xy/VIEWPORT_SIZE
,则可以使用SCREEN_UV
。即 SCREEN_UV = FRAGCOORD.xy/VIEWPORT_SIZE
。正如您所期望的,FRAGCOORD
是以像素为单位的片段坐标,而 SCREEN_UV
为您提供标准化坐标(0 到 1)。
顺便说一下,如果您不希望 Material 依赖于屏幕上的位置,您可以将 SCREEN_UV
替换为 UV
。>
顺便说一下,是的,我知道 SCREEN_UV
说的是“屏幕”而不是“视口(viewport)”。有些命名可能会令人困惑。
在空间着色器中,您不会写入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 ,查看内置程序(包括上面提到的那些)和渲染模式的列表。
关于glsl - 如何获得 godot 空间着色器的分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67206660/