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

标签 glsl godot

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,而是写入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 ,查看内置程序(包括上面提到的那些)和渲染模式的列表。

关于glsl - 如何获得 godot 空间着色器的分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67206660/

相关文章:

opengl - 使用着色器时为 glutBitmapCharacter 设置光栅颜色

godot - Navigation2D 始终返回空路径

Godot:如何识别内置类型的类型?

c++ - 双抛物面阴影贴图

opengl - 如何确保屏幕空间导数存在于三角形边缘?

ios - 如何使用 GLSL 在没有 alpha 混合的情况下组合两个纹理

c++ - OpenGL glLinkProgram 返回 false 但信息日志为空;检查了一切

animation - GODOT - 完整攻击动画未播放

godot - Godot 标签文本中会忽略非 ascii 字符

game-development - Godot 信号是否充当事件处理程序?