Glsl 如何在godot空间着色器上获得分辨率?
屏幕\像素\大小不适用于空间着色器?如何获得分辨率?正如您所注意到的Glsl 如何在godot空间着色器上获得分辨率?,glsl,godot,Glsl,Godot,屏幕\像素\大小不适用于空间着色器?如何获得分辨率?正如您所注意到的SCREEN\u PIXEL\u SIZE在空间着色器中不存在(它存在于画布着色器中) 空间着色器的SCREEN\u PIXEL\u SIZE等效于1.0/VIEWPORT\u SIZE。也就是说,视口大小=1.0/屏幕像素大小 由于1.0/SCREEN\u PIXEL\u SIZE是您想要的,因此您可以直接使用VIEWPORT\u SIZE。它提供视口(绘制着色器的位置,无论是屏幕、窗口还是纹理)的像素大小 此外,如果要执行F
SCREEN\u PIXEL\u SIZE
在空间着色器中不存在(它存在于画布着色器中)
空间着色器的SCREEN\u PIXEL\u SIZE
等效于1.0/VIEWPORT\u SIZE
。也就是说,视口大小=1.0/屏幕像素大小
由于1.0/SCREEN\u PIXEL\u SIZE
是您想要的,因此您可以直接使用VIEWPORT\u SIZE
。它提供视口(绘制着色器的位置,无论是屏幕、窗口还是纹理)的像素大小
此外,如果要执行FRAGCOORD.xy/VIEWPORT\u SIZE
,可以使用SCREEN\u UV
。即SCREEN\u UV=FRAGCOORD.xy/VIEWPORT\u SIZE
。正如您所料,FRAGCOORD
是以像素为单位的片段坐标,而SCREEN\u UV
则提供标准化坐标(0到1)
顺便说一下,如果您不希望材质依赖于屏幕上的位置,您可以将screen\u UV
替换为UV
顺便说一下,是的,我知道SCREEN\u UV
说的是“SCREEN”而不是“viewport”。有些命名可能会令人困惑
在空间着色器中,您不会写入
COLOR
,而是写入ALBEDO
和ALPHA
。Godot会注意到您是否写入ALPHA,并在决定渲染顺序时考虑到这一点(因此潜在的透明材质在不透明材质之后渲染)
说到令人困惑的命名
有关内置(包括上面提到的)和渲染模式的列表,请参阅。谢谢,godot将glgs转换为gdscript着色器使我感到困惑:/I坚持使用c#
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
}
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