Godot着色器案例-放大镜着色器
标签
- #片段着色器 #顶点着色器
素材
放大镜素材
原理
- 使用片段着色器获得镜片中心位置的UV,根据计算后的UV除以放大倍数,并获取到对应位置的屏幕的纹理,赋值给放大镜镜片。
- 计算镜片中心位置的UV时,需要先将要获取的点(0.5,0.5)设置成齐次坐标(添加到第4维),然后依次左乘三个矩阵,将坐标从局部空间转换到世界空间转换到画布空间转换到屏幕空间,然后就可以作为屏幕uv进行计算。
- 因为godot中获取纹理顺序为自上向下,所以可以将放大镜框作为镜片的子节点,这样就不会获取到镜框的纹理。
代码
gdshader
shader_type canvas_item;
uniform float scale_factor = 2.0;
uniform sampler2D screen_tex: hint_screen_texture, filter_nearest;
varying vec2 center_uv;
void vertex() {
center_uv = (SCREEN_MATRIX * CANVAS_MATRIX * MODEL_MATRIX * vec4(0.5, 0.5, 0, 1)).xy;
center_uv = (center_uv + 1.0) / 2.0;
}
void fragment() {
vec2 uv_difference = SCREEN_UV - center_uv;
vec2 modified_uv = uv_difference / 2.0 + center_uv;
vec4 sampled_color = texture(screen_tex, modified_uv);
COLOR.rgb = sampled_color.rgb;
}