画布项目着色器(CanvasItem shaders):Godot的2D着色器
译者注:直译为***画布项目着色器***下文中将意译成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
了。
诸如 UV
和 COLOR
等一些内置成员,如果不加修改的话也会被传入片元函数。例如,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着色器相关推荐
- 在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵
在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵 使用canvas_item着色器进行后期处理时,可能会需要用到对应相机的逆投影矩阵和逆视图矩阵,但是在canvas_item着色 ...
- 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.
- 开源项目-基于Intel VT技术的Linux内核调试器
本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...
- unityshader中的顶点着色器与片段(元)着色器
顶点着色器(Vertax Shader):通常用于实现顶点的空间变换,顶点着色的功能,接收来自CPU的输入,其处理单位就是顶点,在这一步上,无法创立或销毁顶点,也无法得到定点预定点之间的关系,所以顶点 ...
- java的包资源管理器怎么弄出来_eclipse包资源管理器java项目,包,类重命名 来学习吧...
eclipse包资源管理器java项目,包,类重命名,对于修改已知创建的包(包括java项目,java包)和java类文件的命名非常重要的,有时候你的java包里有多个java文件,你要改名字,可以说 ...
- 着色器(Shader)之像素着色器
像素着色器实际上就是对每一个像素进行光栅化的处理期间,在GPU上运算的一段程序. 不同与顶点着色器,像素着色器不会以软件的形式来模拟像素着色器. 像素着色器实质上是取代了固定功能流水线中多重纹理的环节 ...
- 【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器
着色器和程序 一.前言 二.着色器和程序 2.1 创建和编译一个着色器 2.1.1 创建着色器 2.1.2 删除着色器 2.1.3 提供着色器源代码 2.1.4 编译色器 2.1.4 查询有关着色器对 ...
- unity 表面着色器、顶点、片元着色器
1.表面着色器:表面着色器是Unity特有的一种着色器代码类型,表面着色器定义在SubShader中.表面着色器需要编写的代码量很少,Unity会自动处理一些细节.但是表面着色器的本质和顶点.片元着色 ...
- [从零构建光栅渲染器] 6. 顶点和片元着色器的工作原理
[从零构建光栅渲染器] 6. 顶点和片元着色器的工作原理 非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器.教程学习过程非常平滑,从画点.线和三角形开始教学, ...
最新文章
- GitHub重大好消息:私有仓库可无限制免费创建
- 转载 :28 个 Unix/Linux 的命令行神器
- BZOJ 1014 [JSOI2008]火星人prefix
- mysql 加号的作用_MySQL学习笔记(一)
- happens-before
- 树莓派蓝屏_树莓派刷写Windows 10 ARM版后成功运行桌面程序
- 本地方法(JNI)——访问数组元素+错误处理
- Docker JFrog Artifactory 7.27.10 maven私服(IDEA 实战篇01) linux
- python excelwriter保存路径_太赞!Python和Excel终于可以互通了
- PCB板设计后期处理流程及工作步骤有哪些?2021-07-29
- 主板检测卡常见错误代码:00(FF)
- Matlab Bitwise Operator模块
- 2016鄂教版小学信息技术初识计算机软件,鄂教版(2016)五年级全册信息技术 25.揭秘计算机工作世界--初识计算机工作原理 教案...
- android 自动挂断,android项目实现电话自动挂断的功能
- 苏宁大数据怎么运营_苏宁云商:挖掘大数据 只为更懂用户的心
- 10-3 获取日历时间
- 教育培训机构数字化指标-续班率
- 探寻企业app开发的特色功能和技术特点
- Django入门:实现收藏操作
- Coursera | Andrew Ng (01-week-1-1.2)—What is a Neural Network?