GPU像素级对象选取:ShapeUp着色器编码点击拾取技巧全解析
GPU像素级对象选取ShapeUp着色器编码点击拾取技巧全解析【免费下载链接】ShapeUp-publicA 3D Modeler Made in a Week项目地址: https://gitcode.com/gh_mirrors/sh/ShapeUp-publicShapeUp 是一款一周建成的 GPU 体素建模工具用着色器实现建模、渲染与对象选取。本文带你拆解它最巧妙的功能——GPU 像素级点击拾取无需网格碰撞只靠一段动态生成的选取着色器和一次像素回读就能精准判断鼠标点中了哪个对象。 适合读者对 GPU 编程、着色器开发、拾取算法Picking感兴趣的新手与 3D 应用开发者。什么是 ShapeUp一周写成的 GPU 建模器ShapeUp 的作者只用了一周时间就写出了这个基于构造实体几何CSG的 3D 建模工具。它的核心理念非常反传统没有网格整个场景由一组圆角方块RoundBox通过 SDF有向距离场布尔运算拼成全 GPU 渲染每个像素都用光线步进Ray Marching在着色器里实时求解场景代码即模型场景本身就是 C 代码任何改动都会重新拼装着色器源码并热重载。正是最后一点让它的点击选中对象功能有了极其优雅的解法。拾取难题为什么传统方案在这里行不通在常规 3D 引擎里点击选中物体通常靠两种方式网格射线相交——场景必须有三角形网格ShapeUp 里根本没有网格深度缓冲 对象 ID——需要对每个对象做深度测试而 SDF 是连续场无法直接输出 ID。ShapeUp 选择了第三条路着色器编码Shader Encoding 离屏渲染 像素回读。这也是所有场渲染体积渲染、SDF 渲染、噪声渲染应用中最通用的拾取方案。核心思路把对象编号画进颜色里整套方案的精髓一句话让 GPU 渲染一张不可见的图图中每个像素的 R 通道 该像素命中的对象编号 1然后 CPU 回读这一个像素。关键实现在 src/main.c 的object_at_pixel()函数int object_index ((int)pixels[(x w*(h-y))*4]) - 1;R 通道读出i1减 1 就是对象下标读到0时结果为-1表示点空了。点击拾取流程三步走拆解第 1 步动态拼装选取专用着色器每次拾取时程序把四个片段拼成一段全新的片元着色器源码然后从内存直接编译SHADER_VERSION_PREFIX // GLSL 版本头 shader_prefix_fs // SDF 数学函数库见 src/shader_prefix.fs append_map_function(...) // 把全部对象翻译成着色器代码 selection_fs // 选取入口见 src/selection.fs其中append_map_function()src/main.c是灵魂它遍历场景里每一个对象生成一个signed_distance_field()函数把每个对象的R 通道颜色写成自身编号use_color_as_index true时r i1。这样光线命中谁谁就把自己的编号染到像素上。第 2 步只渲染鼠标周围的 3×3 像素这是最见功力的优化。程序并不重画整屏而是创建一个全屏离屏渲染目标RenderTexture只提交一个以鼠标位置为中心、3×3 像素的小四边形src/main.c。着色器里castRay()从相机出发射线、最多迭代 64 次穿过 SDFsrc/selection.fs与主渲染管线共用同一套几何——保证看到的和选中的永远是同一套数学。⚡ 只渲染 9 个像素却调用了完整的 SDF 求交这就是 GPU 拾取看似昂贵实则极快的原因。程序甚至会打印picking object took Xms告诉你耗时。第 3 步回读像素解码编号uint8_t *pixels rlReadTexturePixels(...); int object_index ((int)pixels[(x w*(h-y))*4]) - 1;用rlReadTexturePixels把 GPU 显存中的像素搬回 CPU取(x, y)处的第一个字节R 通道减 1即得对象下标。随后主循环src/main.c只需比较若new_selection ! selected_sphere→ 更新选中对象置needs_rebuild true触发场景着色器重建手柄用户按 R1 键时同样调用该函数选取屏幕正中心的对象逻辑完全复用src/main.c。源码导读关键文件一览文件作用src/main.c主程序object_at_pixel()拾取、场景到着色器的翻译器append_map_function()src/selection.fs选取片元着色器单像素光线步进输出对象编号src/shader_prefix.fsSDF 数学库圆角盒、平滑并集、平滑差集、对称、旋转src/shader_base.fs主渲染管线着色、软阴影、环境光遮蔽MakefilemacOS 构建依赖 lib/raylib-4.5.0_macoswebbuild.shWebAssembly 一键构建脚本一个值得注意的对照主渲染着色器中选中对象是动态的——append_map_function()接受dynamic_index参数被选中对象改用selectionValues_uniform 数组实时驱动位置与角度于是拖拽该对象时不需要重新编译着色器src/main.c。静态编码拾取 动态 uniform 编辑两条路径在同一套 SDF 代码上无缝切换是整份代码里最精巧的设计。实战借鉴这套方案怎么用在你自己的项目里如果你想在自己的 SDF/体积渲染项目里实现同样的点击拾取记住这个通用四步模板编号编码为每个对象分配唯一 ID写入其材质颜色的 R 通道或单独一张 ID 通道离屏渲染用与主渲染完全相同的几何数学只渲染目标像素区域到 FBO像素回读glReadPixels/rlReadTexturePixels取回目标像素解码判定ID-1 为命中对象0 为背景。⚠️ 新手常见坑数学不一致拾取着色器和主渲染着色器必须共用同一套 SDF 源码否则会出现看得见却点不中每帧回读整张图性能杀手。ShapeUp 只画 3×3 像素区域把回读量压到最低忘了 -1R 通道从i1开始编码正是为了和未命中 0区分开。常见问题 FAQQ为什么不用射线与包围盒相交来拾取AShapeUp 的主循环里其实两者都有——控制手柄缩放 gizmo用的是射线包围盒碰撞CPU 侧而点中任意对象本体才走 GPU 像素拾取。CPU 快但只能测简单体GPU 拾取才能精确匹配 SDF 的任意复杂形态。Q拾取会卡顿吗A会有一次 GPU→CPU 的同步开销所以程序专门打印耗时。ShapeUp 的做法是只在鼠标左键释放的瞬间才拾取一次而不是每帧轮询交互流畅度完全无感。QWebAssembly 版本支持吗A支持。同一份 src/main.c 通过PLATFORM_WEB宏适配网页端见 Makefile.Web 与 webbuild.sh像素回读逻辑保持不变。结语ShapeUp 用不到 200 行核心代码一个函数 一个 45 行的着色器就解决了 SDF 建模器里最棘手的点击拾取问题。它的思路——把答案编码进颜色让 GPU 替你判卷——是所有程序化场渲染应用的通用武器。下次你的项目里出现点中了什么的难题时不妨先想想这条 GPU 像素级拾取路线。 想动手研究克隆仓库后 macOS 直接makeWeb 端运行./webbuild.sh重点阅读object_at_pixel()与selection.fs配合本文流程拆解即可快速上手。【免费下载链接】ShapeUp-publicA 3D Modeler Made in a Week项目地址: https://gitcode.com/gh_mirrors/sh/ShapeUp-public创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CreativeML OpenRAIL-M许可详解:商用与再分发时Waifu Diffusion v1.3必须注意的3件事

CreativeML OpenRAIL-M许可详解:商用与再分发时Waifu Diffusion v1.3必须注意的3件事

CreativeML OpenRAIL-M许可详解:商用与再分发时Waifu Diffusion v1.3必须注意的3件事 【免费下载链接】waifu-diffusion-v1-3 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/waifu-diffusion-v1-3 Waifu Diffusion v1.3 是一个基于 Stable Diffu…

2026/8/23 16:27:37 阅读更多 →
为什么内存加载与存储决定GPU性能:Triton-Puzzles 12道谜题背后的核心课程总结

为什么内存加载与存储决定GPU性能:Triton-Puzzles 12道谜题背后的核心课程总结

为什么内存加载与存储决定GPU性能:Triton-Puzzles 12道谜题背后的核心课程总结 【免费下载链接】Triton-Puzzles Puzzles for learning Triton 项目地址: https://gitcode.com/gh_mirrors/tr/Triton-Puzzles Triton-Puzzles 是一个教你从零学会 Triton GPU编…

2026/8/23 16:27:37 阅读更多 →
三步搭起前后端分离后台:TP6-Vue-Admin 完整指南

三步搭起前后端分离后台:TP6-Vue-Admin 完整指南

三步搭起前后端分离后台:TP6-Vue-Admin 完整指南 【免费下载链接】tp6-vue-admin 基于thinkphp6vue2.6element2.13 前后端分离落地解决方案 项目地址: https://gitcode.com/gh_mirrors/tp/tp6-vue-admin 用 ThinkPHP 6 做后台管理系统,还要从零写…

2026/8/23 16:27:37 阅读更多 →

最新新闻

DeepSeek开源一周,Agent第一次有了“组织“

DeepSeek开源一周,Agent第一次有了“组织“

上周我们聊了 DeepSeek Harness(DSH)和它背后那篇 Cordis 论文。论文的结尾有一句话,说未来要让 AI"持续生成并替换自己的组件"——也就是 Agent 自己给自己升级。 当时觉得那是个很远的愿景。 结果一周过去,"自进…

2026/8/23 22:37:10 阅读更多 →
OpenKylin虚拟机安装全攻略:从零到精通的详细步骤与避坑指南

OpenKylin虚拟机安装全攻略:从零到精通的详细步骤与避坑指南

1. 项目概述:为什么选择OpenKylin?最近在折腾国产操作系统,OpenKylin(开放麒麟)这个名字出现的频率越来越高。它作为一款基于Linux内核、由国内社区主导开发的开源桌面操作系统,主打安全、易用和良好的中文…

2026/8/23 22:37:10 阅读更多 →
0xc000012f 错误怎么修复?先修运行库和系统组件,再决定是否重装软件

0xc000012f 错误怎么修复?先修运行库和系统组件,再决定是否重装软件

运行 Windows 软件时弹出 0xc000012f,通常意味着某个程序或它依赖的组件没有通过系统加载校验。遇到这种提示,优先检查系统 DLL、运行库和启动环境是否完整,再根据报错范围判断要不要重装出错应用。单独从网上下载 DLL 来替换,往往…

2026/8/23 22:36:09 阅读更多 →
在Typora中用HTML实现复杂表格:突破Markdown表格限制

在Typora中用HTML实现复杂表格:突破Markdown表格限制

1. 从Markdown的局限到HTML的灵活:为什么我们需要在Typora里写表格代码如果你和我一样,长期使用Typora作为主力Markdown编辑器,那你一定对它的简洁优雅和即时渲染爱不释手。写个简单的表格,用几个竖线和短横线就能搞定&#xff0c…

2026/8/23 22:36:09 阅读更多 →
Windows Installer 服务无法访问怎么办?MSI 安装链路修复与排查要点

Windows Installer 服务无法访问怎么办?MSI 安装链路修复与排查要点

安装 .msi 程序时出现“Windows Installer 服务无法访问”,通常意味着 MSI 安装链路中某个环节没有就绪。报错可能来自服务状态、组件注册、系统目录或权限策略中的任意一环,单靠更换安装包不一定能解决。处理顺序建议先从系统软件组件入手,再…

2026/8/23 22:36:09 阅读更多 →
Windows API 实战指南:从原理到自动化与系统管理

Windows API 实战指南:从原理到自动化与系统管理

1. 从“黑盒”到“工具箱”:理解Windows API的本质如果你在Windows上写过代码,或者尝试过一些自动化脚本,那你一定或多或少接触过“Windows API”这个词。它听起来很高大上,像是系统深处某个神秘的黑盒。但今天,我想把…

2026/8/23 22:35:09 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →