译者注:直译为***画布项目着色器***下文中将意译成2D着色器

画布项目着色器(CanvasItem shaders)

2D着色器用于绘制Godot中的所有的2D元素,包括所有继承于CanvasItem的节点以及所有的GUI元素。

相对于3D着色器,2D着色器要简单一些,内置函数也比较少,但是2D和3D着色器的基础结构是相同的,都包顶点函数(vertex),片元函数(fragment)及光(light)函数

渲染模式画布元素
渲染模式 描述
blend_mix Mix blend mode (alpha is transparency), default.
blend_add Additive blend mode.
blend_sub Subtractive blend mode.
blend_mul Multiplicative blend mode.
blend_premul_alpha Pre-multiplied alpha blend mode.
blend_disabled Disable blending, values (including alpha) are written as-is.
unshaded Result is just albedo. No lighting/shading happens in material.
light_only Only draw on light pass.
skip_vertex_transform VERTEX/NORMAL/etc need to be transformed manually in vertex function.

译者注:vertex built-in,fragment built-in 以及 light built-in根据其实际作用分别被意译为内置顶点属性,内置片元属性以及内置光属性,"属性"一词借用C#中的属性即property,其实就是getter和setter

内置顶点属性(vertex built-ins)

当值注明为in时,意味着只读,当值注明为out时,意味着可以选择性地写入,但是并不一定提供一个有效值。当值注明为inout时,它会提供一个有效的默认值,并且可以选择性地写入。采样器(sampler)不是可写对象,它们也没有被标记。

顶点数据(VERTEX)使用局部坐标表示(相对于摄像机的像素坐标),如果不改写的话,它们的值会原封不动地传递出去。

用户可以关闭内置***模型视图变换***(英文:modelview transform,注:但投影(projection)依然会发生),并使用如下代码手动实现:

shader_type canvas_item;
render_mode skip_vertex_transform;
​
void vertex() {
​VERTEX = (EXTRA_MATRIX * (WORLD_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy;
}

注意:WORLD_MATRIX 实际上是一个模型视图矩阵,它接受局部坐标的输入,然后将其变换到视图空间。

如果想要获取一个顶点的世界坐标,你必须按照如下方法传入一个自定义的uniform值:

material.set_shader_param("global_transform", get_global_transform())

然后在你的顶点着色器部分:

uniform mat4 global_transform;
varying vec2 world_position;
​
void vertex(){world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
}

然后在顶点和片元函数中就都可以使用world_position 了。

诸如 UVCOLOR等一些内置成员,如果不加修改的话也会被传入片元函数。例如,INSTANCE_CUSTOM变量包含着实例的自定义数据。在粒子中,这些数据往往如下所示:

  • x: Rotation angle in radians.

  • y: Phase during lifetime (0 to 1).

  • z: Animation frame.

内置顶点属性 描述
in mat4 WORLD_MATRIX 图片空间(Image space)到视图空间(view space)的变换
in mat4 EXTRA_MATRIX Extra transform.
in mat4 PROJECTION_MATRIX View space to clip space transform.
in float TIME Global time, in seconds.
in vec4 INSTANCE_CUSTOM Instance custom data.
in bool AT_LIGHT_PASS True if this is a light pass.
inout vec2 VERTEX Vertex, in image space.
in vec2 TEXTURE_PIXEL_SIZE Normalized pixel size of default 2D texture. For a Sprite with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)
inout vec2 UV UV.
inout vec4 COLOR Color from vertex primitive.
inout float POINT_SIZE Point size for point drawing.
内置片元属性(Fragment built-ins)

一些节点(例如:Sprite),会显示一个默认的纹理。然而当给这些节点添加了自定义片元函数以后,纹理的查找则需要手动来完成。在内置属性COLOR中,Godot并没有提供纹理的颜色。如果想在这些节点中读取纹理颜色,需要如下方法:

COLOR = texture(TEXTURE, UV);

这和法线贴图有所不同,如果一个节点添加了法线贴图,则Godot可以默认使用它并且把它赋值给内置的NORMAL属性。如果你使用了一个本用于3D的法线贴图,它将呈现为翻转状态。如果你想在自己的Shader中使用它你需要把它赋值给NORMALMAP属性,Godot会把它转换成2D模式并重写NORMAL属性

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;
内置片元属性 描述
in vec4 FRAGCOORD Fragment coordinate, pixel adjusted.
inout vec3 NORMAL Normal read from NORMAL_TEXTURE. Writable.
out vec3 NORMALMAP Configures normal maps meant for 3D for use in 2D. If used, overwrites NORMAL.
inout float NORMALMAP_DEPTH Normalmap depth for scaling.
in vec2 UV UV from vertex function.
inout vec4 COLOR Color from vertex function and output fragment color. If unused, will be set to TEXTURE color.
in sampler2D TEXTURE Default 2D texture.
in sampler2D NORMAL_TEXTURE Default 2D normal texture.
in vec2 TEXTURE_PIXEL_SIZE Normalized pixel size of default 2D texture. For a Sprite with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)
in vec2 SCREEN_UV Screen UV for use with SCREEN_TEXTURE.
in vec2 SCREEN_PIXEL_SIZE Size of individual pixels. Equal to inverse of resolution.
in vec2 POINT_COORD Coordinate for drawing points.
in float TIME Global time in seconds.
in bool AT_LIGHT_PASS True if this is a light pass.
in sampler2D SCREEN_TEXTURE Screen texture, mipmaps contain gaussian blurred versions.
内置光属性(Light built-ins)

相对于3D着色器,2D着色器光函数的工作方式有所不同。在2D着色器中,光函数会在物体被绘制的时候调用一次,然后对场景中每一个触及到这个物体的光都调用一次。如果你不希望任何光影响到某一个物体可以使用unshaded渲染模式。如果你只希望一个物体被光覆盖的地方可见,那么可以使用light_only渲染模式。

当一个着色器(所属的物体)处于光照中时,内置光属性AT_LIGHT_PASS的值将为true

内置光属性 描述
in vec4 FRAGCOORD Fragment coordinate of pixel center. Origin at lower left.
in vec3 NORMAL Input Normal. Although this value is passed in, normal calculation still happens outside of this function.
in vec2 UV UV from vertex function, equivalent to the UV in the fragment function.
in vec4 COLOR Input Color. This is the output of the fragment function with final modulation applied.
sampler2D TEXTURE Current texture in use for CanvasItem.
in vec2 TEXTURE_PIXEL_SIZE Normalized pixel size of default 2D texture. For a Sprite with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)
in vec2 SCREEN_UV SCREEN_TEXTURE Coordinate (for using with screen texture).
in vec2 POINT_COORD UV for Point Sprite.
in float TIME Global time in seconds.
inout vec2 LIGHT_VEC Vector from light to fragment, can be modified to alter shadow computation.
inout float LIGHT_HEIGHT Height of Light. Only effective when normals are used.
inout vec4 LIGHT_COLOR Color of Light.
in vec2 LIGHT_UV UV for Light texture.
out vec4 SHADOW_COLOR Shadow Color of Light.
inout vec4 LIGHT Value from the Light texture and output color. Can be modified. If not used, the light function is ignored.

画布项目着色器(CanvasItem shaders):Godot的2D着色器相关推荐

  1. 在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵

    在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵 使用canvas_item着色器进行后期处理时,可能会需要用到对应相机的逆投影矩阵和逆视图矩阵,但是在canvas_item着色 ...

  2. 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但

    片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.

  3. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  4. unityshader中的顶点着色器与片段(元)着色器

    顶点着色器(Vertax Shader):通常用于实现顶点的空间变换,顶点着色的功能,接收来自CPU的输入,其处理单位就是顶点,在这一步上,无法创立或销毁顶点,也无法得到定点预定点之间的关系,所以顶点 ...

  5. java的包资源管理器怎么弄出来_eclipse包资源管理器java项目,包,类重命名 来学习吧...

    eclipse包资源管理器java项目,包,类重命名,对于修改已知创建的包(包括java项目,java包)和java类文件的命名非常重要的,有时候你的java包里有多个java文件,你要改名字,可以说 ...

  6. 着色器(Shader)之像素着色器

    像素着色器实际上就是对每一个像素进行光栅化的处理期间,在GPU上运算的一段程序. 不同与顶点着色器,像素着色器不会以软件的形式来模拟像素着色器. 像素着色器实质上是取代了固定功能流水线中多重纹理的环节 ...

  7. 【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器

    着色器和程序 一.前言 二.着色器和程序 2.1 创建和编译一个着色器 2.1.1 创建着色器 2.1.2 删除着色器 2.1.3 提供着色器源代码 2.1.4 编译色器 2.1.4 查询有关着色器对 ...

  8. unity 表面着色器、顶点、片元着色器

    1.表面着色器:表面着色器是Unity特有的一种着色器代码类型,表面着色器定义在SubShader中.表面着色器需要编写的代码量很少,Unity会自动处理一些细节.但是表面着色器的本质和顶点.片元着色 ...

  9. [从零构建光栅渲染器] 6. 顶点和片元着色器的工作原理

    [从零构建光栅渲染器] 6. 顶点和片元着色器的工作原理 非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器.教程学习过程非常平滑,从画点.线和三角形开始教学, ...

最新文章

  1. GitHub重大好消息:私有仓库可无限制免费创建
  2. 转载 :28 个 Unix/Linux 的命令行神器
  3. BZOJ 1014 [JSOI2008]火星人prefix
  4. mysql 加号的作用_MySQL学习笔记(一)
  5. happens-before
  6. 树莓派蓝屏_树莓派刷写Windows 10 ARM版后成功运行桌面程序
  7. 本地方法(JNI)——访问数组元素+错误处理
  8. Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
  9. python excelwriter保存路径_太赞!Python和Excel终于可以互通了
  10. PCB板设计后期处理流程及工作步骤有哪些?2021-07-29
  11. 主板检测卡常见错误代码:00(FF)
  12. Matlab Bitwise Operator模块
  13. 2016鄂教版小学信息技术初识计算机软件,鄂教版(2016)五年级全册信息技术 25.揭秘计算机工作世界--初识计算机工作原理 教案...
  14. android 自动挂断,android项目实现电话自动挂断的功能
  15. 苏宁大数据怎么运营_苏宁云商:挖掘大数据 只为更懂用户的心
  16. 10-3 获取日历时间
  17. 教育培训机构数字化指标-续班率
  18. 探寻企业app开发的特色功能和技术特点
  19. Django入门:实现收藏操作
  20. Coursera | Andrew Ng (01-week-1-1.2)—What is a Neural Network?

热门文章

  1. 微信打开网页 提示防诈骗
  2. 苹果6s上市时间_6s为什么会在iOS14系统支持名单?
  3. 二维树状数组--hdu1892
  4. 阿里云服务器购买与配置(4)安装nginx
  5. 文本文件和二进制文件的区别和联系
  6. Helm和kustomize
  7. 已解决:注册kaggle人机验证出不来
  8. 纯CSS调整select选择框高度,兼容IE/Firefox/Opera/Safair/Chrome
  9. window7_64安装STAF
  10. 郑州财经学院第54次全国计算机,听爷爷讲故事