Windows下用shaderc编译bgfx的HLSL着色器:从环境到实战
如果你刚把 bgfx 拉下来准备跑第一个渲染 demo然后在 Windows 上用 HLSL 编译 shader大概率会被 shaderc 这个命令行工具卡一下。倒不是说 shaderc 有多难装而是 bgfx 的 shader 编译链和 D3D 原生的 fxc/dxc 完全是两条路它不会帮你把 .hlsl 直接转成一套字节码就完事而是要把你的 HLSL 塞进一套有自己格式规则的工具链里生成 .bin再交给 bgfx 的 D3D11/12、OpenGL、Vulkan 后端去消费。我这边跨平台渲染层从自研替换成 bgfx 已经有几轮迭代日常开发在 Windows 上做预览shader 源文件清一色 HLSL所以 shaderc 编译这段流程几乎是天天在用。这篇内容想聊的就是这条链路上真正会被绊住的地方环境怎么搭、HLSL 源文件该怎么写才入得了 shaderc 的眼、命令行参数怎么组合、报错怎么定位以及最终编译出来的 .bin 又是怎么进到渲染循环里去的。适合的对象很简单刚开始接触 bgfx、想在 Windows 上用 HLSL 写 shader却被编译环节卡住的开发者。1. bgfx 的 shader 为什么不能拿 HLSL 直接用编译体系背景1.1 跨平台后端决定了它不可能走原生 D3D 那套如果你之前写 D3D通常在 CPU 侧拿 D3DCompile 把 HLSL 编译成 DXBC或者用 dxc 编成 DXIL再在运行时创建 shader 对象。这套流程在纯 Windows Direct3D 的软件里是顺的但 bgfx 是渲染抽象层一个场景可能同时在 D3D11、OpenGL、Vulkan 甚至 Metal 后端上跑。如果直接在 CPU 侧依赖 D3D 编译器那 OpenGL/Vulkan 后端就拿不到任何能用的东西。所以 bgfx 走了中间层所有 shader 统一交给 shaderc 工具做离线编译生成“bgfx shader 二进制”.bin这个二进制是一个带自定义头部的容器里面最主要的载荷是某个特定后端可执行的 shader 字节码或源码。到运行时bgfx 再根据当前激活的 renderer 类型去解析对应部分。换句话说你在 Windows 上编译 HLSL得到的并不是一个能跨平台一条命吃遍所有后端的万用文件而是“在当前平台配置和目标后端配置下生成的成果”。这一点很容易被刚接触的人忽略以为编译出一个 .bin 就能到处用结果换后端一跑就黑屏。1.2 shaderc 到底做了什么shaderc 可以理解成 fxc、dxc、glslangValidator 这些编译器的“总装车间”。它先读入你的源文件按 bgfx 自己的规则解析顶部声明的输入输出流、uniform、sampler然后根据不同目标后端把源语言转成目标格式。我画个不太精确但很好记的类比fxc 是把 HLSL 直接翻译成 GPU 能读的字节码而 shaderc 更像是一个带前置约定的打包厂——它要求源文件先声明自己的输入输出接口再根据“你要发给哪个平台的哪个后端”决定内部到底调用哪一套编译驱动。如果你的编译目标是 Windows D3D 后端它会用 D3D 编译器把 HLSL 编成 DXBC再包上 bgfx 的容器头如果编译目标是 SPIRV它会走 glslang / SPIRV-Cross 这条链把 HLSL 翻译再生成 SPIRV如果后续要跑 OpenGL它也能把 HLSL 转成兼容 GLSL但这部分坑更多一般不建议在跨后端项目里用 HLSL 写全平台 shader。因此明白这一点之后你的源文件要写成什么样就很清楚了不是一个普通 D3D 项目里的任意 HLSL而是至少满足 bgfx 源文件约定的 HLSL。后面第三章会专门讲这个约定长什么样。2. Windows 下的编译工具链从源码到 shaderc 可执行文件2.1 依赖准备VS、Windows SDK 和三个源码仓库在 Windows 上要跑通 shaderc你至少需要三样东西。首先是 Visual Studio。我用的是 Visual Studio 2022但 2019 也完全没问题如果不装全量 IDE只装 “Desktop development with C” 工作负载或者单独的 Build Tools 也行。其次是 Windows SDK因为 shaderc 在 Windows 上编译 HLSL 需要调 d3dcompiler API这个头文件和库文件都跟着 Windows SDK 走。Win10/11 系统目录里一般自带 d3dcompiler_47.dll但编译时依赖的 lib/d3dcompiler.lib 还是需要 SDK 提供而不是随便从网上拉一个。然后是源码。bgfx 不是一个单仓库项目它依赖 bx 和 bimg 两个基础库三者必须并排放到同一级目录下。我在新机器上第一次踩的坑就是只 clone 了 bgfx结果 CMake 配置阶段找不到依赖提示一堆路径不存在。所以老老实实把三个仓库都拉下来。如果你还没来得及跑官方示例这一步很容易漏建议提前准备好。2.2 构建 shaderc我推荐的 CMake 路径bgfx 官方主推的是 genie 脚本生成 VS 工程但个人用下来我更喜欢 CMake。理由是 CMake 对习惯 IDE 的开发者更直接不用在项目的 scripts 目录里找工具、也不用折腾生成的 .sln 文件。操作也很简单在 bgfx 仓库根目录下执行mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease cmake --build . --target shaderc --config ReleaseCMake 配置阶段会自动识别同级目录下的 bx 和 bimg把它们加入编译。构建完成后shaderc.exe 会出现在 build 目录下的某个子目录里不同生成器位置略有差异我习惯直接用find . -name shaderc扫一遍省得猜。如果你已经装好 VS 并通过 CMake 生成了解决方案也可以在 Visual Studio 里打开 build 目录下的 .sln右侧解决方案管理器里找到 shaderc 项目右键编译。效果一样。2.3 第一次运行工具时常见的 DLL 问题shaderc.exe 构建出来之后我建议立刻做一次冒烟测试直接执行shaderc.exe --help这时候最常见的错误是弹窗提示缺少 d3dcompiler_47.dll或者命令行直接报“无法定位程序输入点”。原因通常不是 DLL 不存在而是你的系统里存在多个版本的 d3dcompiler加载顺序出问题。比如某些游戏或渲染软件会在 PATH 里自带一个旧版 DLLshaderc 加载时撞上了。我的处理办法很朴素在 shaderc.exe 所在的目录建一个脚本把 Windows SDK 里对应版本的 d3dcompiler_47.dll 显式拷贝到同一个目录或者把 SDK 的 bin 目录加到 PATH 前面。成功后--help会打出一大串参数说明看到这个工具链就算通了。3. 写出能被 shaderc 接受的 HLSL头文件、$input 与统一语义层3.1 一个能工作的最小 vertex shader先给一个最精简的顶点着色器示例文件名无所谓我习惯用.hlsl做后缀。$input a_position $output v_position #include bgfx_shader.sh void main() { vec4 worldPos mul(u_model[0], vec4(a_position, 1.0)); v_position worldPos.xyz; gl_Position mul(u_viewProj, worldPos); }这段代码里a_position是顶点属性流u_model[0]和u_viewProj是 uniformgl_Position是最终的裁剪坐标v_position是传给像素着色器的 varying。看起来像是混合了 GLSL 习惯的写法但它在 bgfx 体系里是合法的。因为bgfx_shader.sh这个头文件做了大量宏映射把mul、vec4、gl_Position这些符号统一成各后端能正确识别的形式。比如mul在 HLSL 里是矩阵乘法的原生关键字在 GLSL 里没有但通过宏定义编译成不同语言时都会落到正确的操作上。3.2 fragment shader 和纹理采样示例对应的像素着色器可以长这样。先来一个最简单纯色版本$input v_position #include bgfx_shader.sh void main() { gl_FragColor vec4(1.0, 0.0, 0.0, 1.0); }如果有纹理加上 sampler 声明和采样操作$input v_texcoord0 #include bgfx_shader.sh SAMPLER2D(s_texColor, 0); void main() { gl_FragColor texture2D(s_texColor, v_texcoord0); }这里的SAMPLER2D(s_texColor, 0)是 bgfx 封装后的声明方式第二个数字是纹理单元绑定槽位。你不需要自己写Texture2D或sampler2D因为 bgfx_shader.sh 会根据编译目标自动展开成对应语言里的声明格式。3.3 bgfx_shader.sh 到底给你省了什么如果抛开 bgfx 直接写原生 HLSL你需要手动管理POSITION、TEXCOORD0、SV_Position这些语义还要注意 D3D 的系统值语义和 GLSL 的 vertex attribute 编号之间的差异。bgfx 不想让你关心这些于是定了一套统一的命名规则a_前缀是顶点输入v_前缀是顶点到像素的 varying 输出s_前缀是 sampleru_前缀是 uniform。bgfx_shader.sh负责把这套命名映射到不同语言和不同后端对应的本地语义上。所以我的建议是写 bgfx 的 shader 不要凭裸 HLSL 记忆去套顺手把bgfx_shader.sh里常用的宏看一遍至少明白它帮你做了什么。不然漏了 include编译的时候会蹦出一堆“undeclared identifier a_position”之类的错误。3.4 版本差异提醒varying.def.sc 与 $input/$output如果你翻到老项目或者老教程还会看到维护一个varying.def.sc文件的做法里面声明顶点布局和 VS/FS 之间的 varying。这是 bgfx 较早版本的工作方式。新版 shaderc 已经能做到从源文件顶部的$input/$output注释读取输入输出签名不需要单独维护那个文件。但两者核心思想一样编译器需要知道顶点属性流有哪些、插值器有哪些才能正确生成后端字节码。我的建议是新代码直接用$input/$output注释简单直观遇到旧工程再额外处理varying.def.sc。如果你发现某个版本的 shaderc 对$input解析有问题退回去用varying.def.sc也完全不丢人工具版本差异导致的折腾不是你的问题。4. 命令行编译实操参数拆解与两个案例命令4.1 参数速查表我把 shaderc 命令行里最常用的参数列一下用表格看会直观很多。参数作用说明-f输入源文件必填一般是一次编译一个文件-o输出 bin 路径必填生成 bgfx shader 二进制--typeshader 类型vertex / fragment / compute--platform目标平台windows / linux / android / ios / osx 等-pprofilevs_4_0、ps_4_0、vs_5_0、cs_5_0、spirv 等--includeinclude 搜索路径可以多次指定类似 fxc 的 /I--define预定义宏多个宏用逗号分隔--verbose打印详细日志排错时强烈建议开启--bin2c输出成 C 头文件生成 uint8_t 数组适合嵌入代码--raw跳过 bgfx 容器头部只吐裸字节码一般不用4.2 完整编译命令假设你的 vertex shader 文件叫demo.vertex.hlslfragment shader 叫demo.fragment.hlsl两者和bgfx_shader.sh的包含关系已经处理好。编译命令长这样shaderc.exe -f demo.vertex.hlsl -o demo.vertex.bin --type vertex --platform windows -p vs_4_0 --include . shaderc.exe -f demo.fragment.hlsl -o demo.fragment.bin --type fragment --platform windows -p ps_4_0 --include .如果你的 shader 里 include 了公共头文件而它不在当前目录比如放在examples/common下面就再多加一条 include 路径shaderc.exe -f demo.vertex.hlsl -o demo.vertex.bin --type vertex --platform windows -p vs_4_0 --include . --include ../../bgfx/examples/common注意--type和-p必须匹配。vertex 对应vs_开头的 profilefragment 对应ps_开头的 profilecompute 对应cs_开头的 profile。我之前有一次把一个像素着色器用vs_4_0去编shaderc 直接报 profile/profile type mismatch折腾了半天才发现是手滑复制错了参数。4.3 编译产物验证编译成功通常没有任何输出尤其是没加--verbose时命令行干干净净地返回。所以我会顺手看一眼文件大小和头部信息ls -l demo.vertex.bin正常的 bin 文件大小一般有个几 KB不会太小。如果你想确认格式没问题用十六进制编辑器打开能看到开头的 magic 字节以及后面跟着的 uniform 信息、shader 字节码等区块。如果你装了 HxD 之类的工具找一下文件里的 uniform 名称字符串通常能直接看到你声明的u_model[0]、u_viewProj这些名字。这也是排查“uniform 对不上”问题的一个快速方法。4.4 为什么这里用 vs_4_0 而不是 vs_5_0很多第一次接触的人会问现在 D3D11 都 SM5.0 了为什么我示例里写 vs_4_0 / ps_4_0。两个原因。第一SM4.0 足够覆盖大部分常规渲染需求而且兼容面极广几乎现代所有 GPU 都能跑。一个简单的三角形 demo、常规的贴图、光照SM4.0 完全够用。第二当你后续要加 compute shader 时再单独给 compute 用 cs_5_0不影响 vertex/fragment 那边继续用 4.0。没必要一开始就把所有 profile 顶到最高。当然如果项目明确需要某些 SM5.0 特性比如 tessellation、计算着色器那直接用 vs_5_0 / ps_5_0 / cs_5_0 就好shaderc 同样支持。5. 编译报错的定位思路从 D3DCompile 到 include 路径5.1 我实际遇到过的报错清单我把这半年多遇到的 shaderc 报错整理成一个表多数问题都跑不出这几类报错特征根本原因处理方向弹窗提示找不到 d3dcompiler_47.dllDLL 加载路径不对把 Windows SDK 的 DLL 放到 shaderc 同目录invalid profile / profile type mismatch--type和-p不匹配检查 profile 前缀是否对应fatal error: cannot open include file bgfx_shader.shinclude 路径没配好加--include指向 bgfx 公共 shader 目录undeclared identifier a_position漏 include 或命名拼写不对确认加了 bgfx_shader.sh确认 a_ 前缀uniform name not found运行时 uniform 和 bin 里名字不一致用十六进制工具查看 bin 里的 uniform 名error X___ 开头的一堆 HLSL 编译错误源文件本身语法不通过这类就是常规 HLSL 语法排查5.2 拿到一段编译日志怎么读我建议在编译时默认就加--verbose让 shaderc 把预处理和内部调用信息打出来。看到d3dcompiler相关的路径时也能确认它实际加载了哪个 DLL。如果报错信息里带着 HLSL 编译器行号比如error X3000: syntax error那基本就是源文件语法层面的问题。这种情况应老老实实回到 HLSL 本身去检查不要怀疑 bgfx 工具链。最常见的几个低级错误是分号漏了、函数名拼错、vec4变量在 HLSL 路径下被某个宏弄成无效类型。如果报错是cannot open include file先确认你的 include 路径。这里有个细节如果 shader 里写的是#include bgfx_shader.sh尖括号形式shaderc 会按系统 include 路径去搜如果你用的是#include bgfx_shader.sh那就是相对于当前源文件所在目录。两种写法在 shaderc 里都能工作但对应的 include 路径配置不一样排查时先看自己写的是哪种。5.3 两个容易漏掉的实战细节第一个细节shaderc 和 shaderc 的静态链接版可能行为不一致。如果你从源码构建 shaderc 并且链接方式是动态链接那么目标机器上缺 DLL 就会运行时报错。如果是给别人使用最好做成静态链接版本或者把 d3dcompiler_47.dll 一起分发。第二个细节如果你把 shaderc 路径加到 PATH注意别跟别的工具链重名。有些渲染工具内置了一个同样叫 shaderc 的文件但不是 bgfx 的执行时一旦 PATH 顺序靠前就会出现“参数都对但行为奇怪”的灵异问题。我建议在编译脚本里直接写明 shaderc 的绝对路径明牌操作不碰运气。6. 把编译产物送进渲染循环加载、Program 创建和运行时检查6.1 从文件到 bgfx::ShaderHandle编译出的 .bin 只是一个二进制资源文件运行时需要自己读出来交给 bgfx。我习惯写一个小的工具函数统一加载static bgfx::ShaderHandle loadShader(const char* _path) { std::ifstream file(_path, std::ios::binary); if (!file.is_open()) { return BGFX_INVALID_HANDLE; } std::vectoruint8_t data((std::istreambuf_iteratorchar(file)), std::istreambuf_iteratorchar()); const bgfx::Memory* mem bgfx::copy(data.data(), (uint32_t)data.size()); return bgfx::createShader(mem); }注意bgfx::copy会拷贝一份数据所以 vector 出作用域后不用担心失效。如果你对内存管理很在意也可以直接用bgfx::makeRef(data.data(), size)避免拷贝但此时要自己保证数据生命周期。6.2 创建 Program 并处理 Shader 句柄销毁拿到 vertex 和 fragment 两个 shader handle 之后组合成 programbgfx::ShaderHandle vsh loadShader(demo.vertex.bin); bgfx::ShaderHandle fsh loadShader(demo.fragment.bin); bgfx::ProgramHandle program bgfx::createProgram(vsh, fsh, true);这里第三个参数true表示 program 创建成功后自动销毁 vsh 和 fsh 两个 shader handle。如果你设成false则要记得自己手动bgfx::destroy(vsh)和bgfx::destroy(fsh)不然会泄漏资源。我一般直接传 true少一层管理负担。6.3 uniform 绑定这条最容易翻车运行时的 uniform 绑定要求 CPU 侧创建 uniform 的名字和 shader 里声明的名字严格一致。比如 shader 里写了uniform vec4 u_lightDir;CPU 侧就要写bgfx::UniformHandle u_lightDir bgfx::createUniform(u_lightDir, bgfx::UniformType::Vec4);然后每一帧设置bgfx::setUniform(u_lightDir, lightDirValue);这里的坑在于名字只要差一个字母或者类型对不上运行时不一定会崩但效果会错。比如光照方向变量没起作用画面还是黑漆漆一片多半就是某个 uniform 名字拼错了。我排查这类问题时的习惯是用十六进制工具打开 bin 文件搜索u_lightDir字符串和你代码里的字符串逐一比对肉眼核对效率非常高。6.4 给 Windows 开发环境加个小脚本一键批量编译最后分享一个实用习惯。我在 Windows 上不会每次都手敲两条 shaderc 命令而是在项目里维护一个shader_build.batset SHADERC...\shaderc.exe set INCLUDE_ARGS--include . %SHADERC% -f demo.vertex.hlsl -o demo.vertex.bin --type vertex --platform windows -p vs_4_0 %INCLUDE_ARGS% %SHADERC% -f demo.fragment.hlsl -o demo.fragment.bin --type fragment --platform windows -p ps_4_0 %INCLUDE_ARGS% echo shader build done以后每次改完 shader 源码直接双击脚本就能把所有 bin 产物重出一遍。如果项目里 shader 文件多了还能在这个脚本里加循环按文件后缀自动区分类型。我自己在几个项目里长期这么用下来的感觉是bgfx 这套离线编译链只要理解它“先约定、后分发”的定位其实没有想象中麻烦。最耗时间的不是工具本身而是第一次摸不清它跟纯 D3D 流程的区别时用错误的预期去推工具链的槽点。把上面这几层流程捋顺之后shader 编译基本不会再是开发路上的瓶颈。

相关新闻

配电房智能辅助监控系统站端设备部署与调试实战指南

配电房智能辅助监控系统站端设备部署与调试实战指南

配电房智能辅助监控系统我实际部署过一套,从传感器选型到站端主机调试,再到联动策略配置,踩了不少坑。今天把这些经验按站端监控设备的维度拆开讲,重点说清楚每类设备在配电房里到底怎么装、怎么接、怎么调,以及最容易…

2026/10/19 13:06:27 阅读更多 →
Flink时间语义详解:事件时间、处理时间与水位线原理

Flink时间语义详解:事件时间、处理时间与水位线原理

1. 为什么“时间”是Flink里最让人头疼又最不能绕开的概念刚接触Flink那会儿,我跟大多数新手一样,以为流处理就是“把数据一条条喂进去,算完就出结果”,直到第一次写窗口聚合,发现输出结果要么迟迟不来,要么…

2026/10/19 13:05:26 阅读更多 →
Android系统开发实战:Binder、Activity启动与系统稳定性核心解析

Android系统开发实战:Binder、Activity启动与系统稳定性核心解析

1. 这个岗位到底在做什么:Android系统开发的真实工作边界 很多人一听到"Android系统开发工程师",第一反应是"不就是写App的吗?",或者觉得"系统层的东西太底层了,离业务太远,学了没…

2026/10/19 13:05:26 阅读更多 →

最新新闻

昇腾CANN+MindSpore端侧部署实战:从模型转换到智慧家居安全防线

昇腾CANN+MindSpore端侧部署实战:从模型转换到智慧家居安全防线

要是有人问昇腾这条技术栈到底怎么落地,我一般不会先搬概念,而是拿一个具体的端侧项目当靶子拆。昇腾CANN与MindSpore这套组合,很多人的第一反应是“这玩意儿是不是只有大厂才用得起”,实际上把场景压缩到智慧家居安全这个规模&am…

2026/10/19 13:48:31 阅读更多 →
仓库架构风格:共享数据治理与微服务迁移的权衡之道

仓库架构风格:共享数据治理与微服务迁移的权衡之道

有时候技术选型往往被一两句话带过去,但背后隐藏的胜负手却很少有人讲透。前阵子我们在评审一套订单系统的重构方案,两个方向争得不可开交:一方认为所有服务必须共享一个核心数据库,省事、一致性好;另一方坚持每个服务…

2026/10/19 13:48:31 阅读更多 →
AI角色一键生成怎么用?从3D流程到引擎落地的完整拆解

AI角色一键生成怎么用?从3D流程到引擎落地的完整拆解

这两年做3D角色资产,我最大的感受是:真正吃掉项目排期的往往不是创意环节,而是从概念图到可绑定角色之间那段冗长的重复劳动。雕刻、拓扑、拆UV、烘贴图、蒙皮绑定,每一步都熟门熟路,每一步也都在反复消耗时间。最近我…

2026/10/19 13:48:31 阅读更多 →
上下文工程:从记忆存储到智能决策的Agent全栈实践

上下文工程:从记忆存储到智能决策的Agent全栈实践

这两年做 Agent 项目,最深的体感是:模型能力本身已经不是主要瓶颈,真正拉开差距的是上下文工程。同一个底座模型,有人搭出来的 Agent 像个靠谱的实习生,有人搭出来的就是个复读机。差别不在 prompt 写得多花哨&#xf…

2026/10/19 13:48:31 阅读更多 →
AI写作工具如何助力专科论文:从选题到降重的完整流程解析

AI写作工具如何助力专科论文:从选题到降重的完整流程解析

2026年毕业季对专科生来说,节奏其实比想象中紧张。大三通常要跟实习、回校做毕业设计,周末改完开题又要赶初稿,很多同学真正的论文“开工日”拖到寒假才启动。写专科论文的难,很多时候不是文笔不行,而是不知道论文的完…

2026/10/19 13:48:31 阅读更多 →
链表每 k 个一组翻转:核心思路与递归迭代实现

链表每 k 个一组翻转:核心思路与递归迭代实现

1. 题目到底在问什么:先别急着写代码链表中的节点每 k 个一组翻转,这是一个非常典型的单向链表操作题。这句话拆开看有三层要求:按 k 个节点划分成一组、每个分组内部做逆序、组与组之间保持原有相对顺序。很多第一次接触这道题的朋友&#x…

2026/10/19 13:47:31 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →