如何在Godot片段着色器中获取指定世界坐标对应的像素颜色
实现步骤
首先你需要先完成前置准备:将你的整个场景提前渲染到一个Viewport纹理中,再将该纹理作为uniform传入当前片段着色器,无法直接采样当前正在绘制的帧缓冲,会出现数据错误。
着色器内的计算逻辑如下:
- 计算Y轴偏移10后的目标世界坐标
vec3 target_world_pos = pixel_world_pos + vec3(0.0, 10.0, 0.0);
- 通过视图投影矩阵将世界坐标转换为裁剪空间坐标
vec4 target_clip_pos = VIEW_PROJECTION_MATRIX * vec4(target_world_pos, 1.0);
- 执行透视除法得到范围在[-1,1]的归一化设备坐标(NDC)
vec3 target_ndc = target_clip_pos.xyz / target_clip_pos.w;
- 将NDC的XY分量转换为适配纹理采样的[0,1]区间UV坐标,需翻转Y轴适配Godot纹理的坐标规则
vec2 target_uv = (target_ndc.xy + 1.0) * 0.5; target_uv.y = 1.0 - target_uv.y;
- 采样提前渲染好的场景纹理,获取对应位置的像素颜色
vec4 target_color = texture(scene_texture, target_uv);
注意事项
- 采样前可以先判断
target_clip_pos.w的正负,如果值小于等于0,说明目标点在相机视锥体后方/之外,不存在对应画面,可以自定义返回默认颜色避免采样错误 - 上述方法适配Godot 3.x和4.x的3D场景,2D场景可直接通过目标世界坐标和Viewport的像素尺寸直接换算UV,无需矩阵转换
- 如果目标点被其他物体遮挡,采样得到的颜色会是遮挡物体的颜色,符合正常的渲染逻辑
内容的提问来源于stack exchange,提问作者Richard Garfield
相关产品推荐
相关产品推荐

