glslViewer:命令行GLSL着色器实时调试沙箱
简介glslViewer是一款面向图形开发初学者与OpenGL着色器进阶实践者的轻量级控制台GLSL沙箱工具专为Linux、macOS、Raspberry Pi等无GUI环境设计解决2D/3D着色器快速调试、热重载与跨平台验证难题。资源包共2000个文件涵盖177个frag着色器示例、139个hpp头文件、41个cpp实现及大量glsl、py、sh、makefile等工程支撑文件完整包含源码构建体系、PBR默认着色器、几何模型OBJ/GLTF/PLY加载支持及纹理/立方体贴图导入能力压缩包仅28.79MB结构紧凑、即装即用。已有548人学习下载适合需要在终端高效迭代Shader逻辑、理解uniform传递、#include依赖解析及OSC交互机制的开发者。读者可直接运行示例、修改顶点/片段着色器并实时观察效果同时获得全套GL扩展头文件如GL_ARB_instanced_arrays、GL_EXT_texture_compression_rgtc等为嵌入式图形开发与教学实验提供坚实基础。1. glslViewer为什么一个命令行着色器沙箱成了我调试粒子系统、后处理链和UV动画的「后悔药」你有没有过这种时刻在大型渲染管线里调一个屏幕空间模糊改了十次 fragment shader却要等完整编译加载切场景才能看到结果或者写一段基于噪声的2D流体模拟想实时拖动鼠标控制频率偏移却卡在 OpenGL 上下文初始化和事件循环胶水代码里glslViewer 就是为这类「秒级验证」而生的——它不生成可执行程序不依赖 IDE 插件甚至不碰 C 主循环它把 GLSL 顶点/片元着色器当源文件直接加载用 GLFW 创建最小 OpenGL 上下文用 ImGui或原生 GLFW注入鼠标/键盘/时间变量最后把渲染结果塞进终端窗口或独立窗口。它不是教学工具而是工程师的「着色器探针」你扔进去一个.frag文件它立刻给你一个可交互的 60FPS 预览。适合图形程序员、Shader 艺术家、实时 VFX 工程师以及所有被「改一行 shader 等半分钟」折磨过的人。它不替代完整引擎但能让你在写进 Unity Shader Graph 或 Unreal Material 前先确认数学逻辑是否成立。2. 从零启动用 glslViewer 在本地跑通第一个 2D 片元着色器的最小命令glslViewer 的核心哲学是「文件即程序」没有项目配置、没有构建步骤、没有头文件包含路径。你只需要一个.frag文件和一条终端命令。下面以最简的渐变着色器为例走通从创建到运行的全链路。2.1 创建你的第一个着色器文件gradient.frag// gradient.frag #ifdef GL_ES precision mediump float; #endif void main() { vec2 uv (gl_FragCoord.xy - 0.5 * iResolution.xy) / min(iResolution.x, iResolution.y); float t iTime * 0.5; vec3 color 0.5 0.5 * cos(t uv.xyx vec3(0.0, 2.0, 4.0)); gl_FragColor vec4(color, 1.0); }注意glslViewer 默认启用#define GL_ES和#define iTime等内置宏。iResolution是 vec2 类型值为当前窗口分辨率iTime是 float单位为秒自动随帧更新。这是它区别于裸 OpenGL 的关键抽象层——你不用手写glUniform1f(glGetUniformLocation(prog, iTime), time)。2.2 安装 glslViewermacOS / Linux / Windows WSL 三平台统一方案glslViewer 官方推荐通过源码编译安装因其强依赖 GLFW、GLM、stb_image 等底层库预编译二进制常因 OpenGL 驱动版本不兼容而黑屏。我们采用跨平台兼容性最强的 CMake 方式# 克隆仓库主分支持续维护无需 checkout 特定 tag git clone https://github.com/patriciogonzalezvivo/glslViewer.git cd glslViewer # 创建构建目录并配置关键禁用 X11Linux或强制使用 OpenGL 3.3 Core Profile mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease \ -DGLFW_BUILD_EXAMPLESOFF \ -DGLFW_BUILD_TESTSOFF \ -DGLFW_INSTALLOFF # 编译-j$(nproc) 加速Windows 用 -j%NUMBER_OF_PROCESSORS% make -j$(nproc) # 安装到系统 PATHLinux/macOS sudo make install # Windows WSL将 build/src/glslViewer 添加到 ~/.bashrc 的 PATH逻辑说明-DGLFW_BUILD_EXAMPLESOFF是必须项——glslViewer 自带事件循环若启用 GLFW 示例会冲突-DGLFW_INSTALLOFF避免覆盖系统 GLFWCMake 不指定-G生成器时默认使用 Ninja比 Make 更快或 Unix Makefiles。编译耗时约 40 秒i7-11800H生成单个可执行文件glslViewer大小约 1.2MB静态链接后。2.3 运行并验证三步确认环境就绪# 1. 检查版本与 OpenGL 支持 glslViewer --version # 输出应含 OpenGL 3.3 或更高且无 GLXBadContext 类错误 # 2. 启动最小窗口默认 800x600无窗口装饰 glslViewer gradient.frag # 3. 进阶指定分辨率、禁用垂直同步、启用线框模式用于调试几何 glslViewer gradient.frag -w 1280 -h 720 -V 0 -wireframe参数说明-w/-h显式设置窗口宽高避免 HiDPI 下分辨率错乱-V 0关闭 vsync确保iTime时间戳严格按帧间隔递增vsync 开启时可能跳帧导致动画卡顿-wireframe对后续加载.obj模型时调试拓扑极有用但对纯 2D shader 无影响若启动后窗口空白或报GL_INVALID_OPERATION大概率是驱动未启用 OpenGL 3.3 —— 此时需检查glxinfo | grep OpenGL versionLinux或glfwGetVersionString()日志macOS。3. 从 2D 到 3D加载模型、传递 Uniform、实现相机交互的完整工作流glslViewer 不仅支持.frag还支持.vert顶点着色器、.geom几何着色器、.comp计算着色器以及.obj、.dae等网格格式。这意味着你可以用它快速验证 PBR 材质、法线贴图采样、Tessellation 控制等 3D 渲染环节而无需搭建完整渲染器。3.1 加载 OBJ 模型并绑定基础材质model.fragcube.obj首先准备一个标准立方体模型可用 Blender 导出.obj确保包含vn法线和vtUV# 生成最小 cube.obj6 面每面 2 三角形带法线和 UV echo -e v -1 -1 -1\nv 1 -1 -1\nv 1 1 -1\nv -1 1 -1\nv -1 -1 1\nv 1 -1 1\nv 1 1 1\nv -1 1 1\nvn 0 0 -1\nvn 0 0 1\nvn 0 -1 0\nvn 0 1 0\nvn -1 0 0\nvn 1 0 0\nvt 0 0\nvt 1 0\nvt 1 1\nvt 0 1\nf 1/1/1 2/2/1 3/3/1\nf 1/1/1 3/3/1 4/4/1\nf 5/1/2 6/2/2 7/3/2\nf 5/1/2 7/3/2 8/4/2\nf 1/1/3 5/2/3 6/3/3\nf 1/1/3 6/3/3 2/4/3\nf 2/1/4 6/2/4 7/3/4\nf 2/1/4 7/3/4 3/4/4\nf 3/1/5 7/2/5 8/3/5\nf 3/1/5 8/3/5 4/4/5\nf 4/1/6 8/2/6 5/3/6\nf 4/1/6 5/3/6 1/4/6 cube.obj然后编写model.frag读取模型并应用 Phong 光照#ifdef GL_ES precision mediump float; #endif uniform vec3 uLightPosition; uniform vec3 uCameraPosition; varying vec3 vNormal; varying vec3 vWorldPos; void main() { vec3 lightDir normalize(uLightPosition - vWorldPos); vec3 viewDir normalize(uCameraPosition - vWorldPos); vec3 reflectDir reflect(-lightDir, vNormal); float diff max(dot(vNormal, lightDir), 0.0); float spec pow(max(dot(viewDir, reflectDir), 0.0), 64.0); vec3 ambient 0.1 * vec3(1.0); vec3 diffuse 0.7 * diff * vec3(1.0, 0.5, 0.2); vec3 specular 0.3 * spec * vec3(1.0); gl_FragColor vec4(ambient diffuse specular, 1.0); }关键点glslViewer 自动为.obj模型提供vNormal插值后的世界法线、vWorldPos世界空间顶点位置等 varying 变量并绑定uLightPosition默认(0,5,5)、uCameraPosition默认(0,0,5)等 uniform。你无需手写顶点着色器——除非需要自定义变换逻辑。3.2 启动 3D 模型预览命令行传参与交互控制# 同时加载模型和着色器顺序无关glslViewer 自动识别 glslViewer cube.obj model.frag # 指定光源位置、相机位置、背景色 glslViewer cube.obj model.frag \ --light 0.0,10.0,10.0 \ --camera 0.0,0.0,8.0 \ --background 0.1,0.1,0.1 # 启用鼠标拖拽旋转、滚轮缩放默认已开启此处显式声明 glslViewer cube.obj model.frag -mouse交互说明左键拖拽绕模型中心旋转欧拉角非轨道球右键拖拽平移相机pan滚轮缩放dolly空格键重置视图所有交互参数uLightPosition,uCameraPosition,uModelMatrix均自动映射为 uniform可在 shader 中直接使用。3.3 扩展添加纹理贴图与多 Pass 渲染glslViewer 支持--texture参数加载 PNG/JPG/BMP 贴图并自动绑定为uTexture0# 下载一张砖墙贴图或用 GIMP 生成 512x512 灰度噪声图 curl -o brick.jpg https://raw.githubusercontent.com/patriciogonzalezvivo/glslViewer/master/assets/textures/brick.jpg # 修改 model.frag在片元着色器中采样 // ... 在 main() 函数开头添加 vec2 uv vWorldPos.xy * 0.5 0.5; // 简单 UV 映射 vec4 texColor texture2D(uTexture0, uv); gl_FragColor texColor * vec4(ambient diffuse specular, 1.0);# 启动时绑定贴图 glslViewer cube.obj model.frag --texture brick.jpg纹理坐标提示glslViewer 不自动提供vTexCoordvarying因.obj文件 UV 命名不统一故需在 shader 中手动构造 UV。常见做法是用vWorldPos.xy、vWorldPos.xz或vWorldPos.yz归一化后作为 UV或用fwidth()构造屏幕空间 UV。4. 避坑指南glslViewer 使用中 4 个高频翻车现场与血泪经验glslViewer 表面简洁但底层 OpenGL 上下文、驱动兼容性、GLSL 版本差异极易引发玄学问题。以下是我在某跨平台图像处理 Demo 中踩过的 4 个真实坑附带复现条件与根治方案。4.1 现象窗口启动后全黑终端无报错glslViewer --version显示 OpenGL 4.1原因Intel 核显如 HD Graphics 620在 Linux 上默认启用 Mesa 的llvmpipe软渲染而非真实 GPU。glxinfo | grep OpenGL renderer显示llvmpipe即证实。解决强制启用硬件加速# Ubuntu/Debian sudo apt install mesa-utils export LIBGL_ALWAYS_SOFTWARE0 glslViewer test.frag若仍无效检查mesa-vulkan-drivers是否安装并尝试__EGL_VENDOR_LIBRARY_FILENAMES/usr/share/glvnd/egl_vendor.d/10_mesa.json glslViewer test.frag4.2 现象.frag文件中#include noise.glsl报错file not found原因glslViewer不支持#include预处理官方明确说明。它只解析顶层文件所有依赖必须内联或用-i参数注入。解决用-i参数注入常用函数库# 将 noise.glsl 内容保存为文件用 -i 注入注意-i 必须在着色器文件之前 glslViewer -i noise.glsl test.fragnoise.glsl中不能有#version且所有函数需声明在main()之前。-i可多次使用顺序即注入顺序。4.3 现象加载.obj后模型显示为白色平面法线光照完全失效原因.obj文件缺少vn法线行或f面索引中法线索引缺失如f 1/1 2/2 3/3无/1。glslViewer 无法推断法线时vNormal默认为(0,0,0)导致dot(vNormal, lightDir)恒为 0。解决用meshlab或blender重导出.obj勾选Write Normals和Include UVs或用 Python 脚本补全法线# fix_obj_normals.py import numpy as np # 此处省略具体补全逻辑核心是读取 v 坐标计算面法线平均到顶点 # 输出带 vn 和 f v/vt/vn 的新 .obj4.4 现象iMouse坐标始终为(0,0)鼠标移动无响应原因启动时未加-mouse参数或终端复用旧窗口glslViewer 默认复用上一个窗口句柄。解决每次运行加-mouse强制启用加-ffullscreen或-w 1024 -h 768强制新建窗口终端中pkill glslViewer清理残留进程。血泪经验所有交互变量iMouse,iDate,iChannel0都依赖 GLFW 事件循环正常工作。若glslViewer启动后 CPU 占用为 0%说明事件循环卡死——此时必是-mouse缺失或窗口复用冲突。5. 进阶技巧用 glslViewer 实现「着色器热重载」与跨平台离线部署glslViewer 最被低估的能力是它能作为 CI/CD 流水线中的「着色器单元测试」节点。我曾在某高校图形学课程实验中用它实现了学生提交的.frag文件自动编译截图PSNR 对比全程无需图形界面。以下两个技巧让 glslViewer 从玩具升级为生产工具。5.1 技巧一无窗口模式Headless截图与自动化验证glslViewer 支持-ssave frame参数在无 GUI 环境下渲染单帧并保存为 PNG# 在 Ubuntu Server无 X11中渲染第 60 帧iTime1.0 glslViewer test.frag -s frame.png -f 60 -w 800 -h 600 -V 0 # 验证截图是否为空检测黑屏 identify -format %[mean] frame.png | awk {if ($1 10) exit 1}关键参数-f 60渲染第 60 帧iTime 60.0 / 60.0 1.0-V 0禁用 vsync确保帧数精确-s frame.png保存为 PNG支持 JPG/BMP/TGA若需多帧序列用-s frames_%04d.png -f 100生成 100 帧。落地场景学生作业自动批改对比参考图与提交图的 SSIMShader 库 CI每次 PR 提交运行glslViewer shader.frag -s ref.png -f 1用imagemagick计算差异文档生成为 Wiki 中每个 shader 示例自动生成 GIF用convert frames_*.png -delay 10 shader.gif。5.2 技巧二打包为单文件可执行程序Linux/macOS/WindowsglslViewer 本身是静态链接的单二进制但依赖着色器文件。要分发给无编译环境的用户需将.frag内联进二进制# 方法用 xxd 将着色器转为 C 数组编译进 glslViewer 源码 xxd -i test.frag shader.h # 修改 src/main.cpp在 main() 开头添加 // #include shader.h // const char* g_shaderSource (const char*)test_frag; // glslViewer::run(g_shaderSource, test.frag);更轻量方案推荐用cat将 shader 与 glslViewer 拼接为自解压脚本#!/bin/bash # glslViewer-bundle.sh SELF$(readlink -f $0) SHADER$(tail -n $(grep -n ^#SHADER$ $SELF | cut -d: -f1) $SELF | head -n -1) echo $SHADER /tmp/bundled.frag /path/to/glslViewer /tmp/bundled.frag $ rm /tmp/bundled.frag exit 0 #SHADER$ # paste your .frag content here用户双击即运行无需解压、无需安装。5.3 技巧三用 glslViewer 调试 WebGPU / WebGL 着色器兼容性WebGL 2.0 与 OpenGL ES 3.0 高度兼容而 glslViewer 默认使用 OpenGL 3.3 Core Profile语义几乎一致。因此一个在 glslViewer 中跑通的 shader90% 概率可直接粘贴进 Three.js 的RawShaderMaterial// three.js 中复用 glslViewer 的 shader const material new THREE.RawShaderMaterial({ vertexShader: document.getElementById(vertex-shader).textContent, fragmentShader: document.getElementById(fragment-shader).textContent, uniforms: { iTime: { value: 0 }, iResolution: { value: new THREE.Vector2(window.innerWidth, window.innerHeight) } } });差异清单必须手动修正glslViewerWebGL / Three.jsiTimeuniform float uTimeiResolutionuniform vec2 uResolutioniMouseuniform vec2 uMouse需在 JS 中onMouseMove更新texture2D()texture()WebGL 2.0修正后即可用 glslViewer 快速迭代再一键迁移到网页端。我坚持把 glslViewer 当作「着色器的 GCC」——写完hello.fragglslViewer hello.frag就是gcc -o hello hello.c-s是gcc -S生成汇编-i是-I头文件路径。它不承诺帮你建工程但保证每一行 GLSL 都被 OpenGL 驱动真实执行。这种确定性是任何 IDE 插件或在线编辑器给不了的。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI 模型训练数据从哪里获取?AI 训练数据集获取渠道与方法大全

AI 模型训练数据从哪里获取?AI 训练数据集获取渠道与方法大全

在人工智能技术飞速迭代的今天,AI 模型训练数据从哪里获取已成为企业与研发机构面临的核心命题。高质量、合规的训练数据是决定模型性能上限的关键基石,而面对海量且杂乱的网络信息,如何精准获取AI 训练数据集并规避版权风险,是行…

2026/10/14 10:22:22 阅读更多 →
H5中集成高德地图的兼容性与坐标纠偏实战指南

H5中集成高德地图的兼容性与坐标纠偏实战指南

1. 项目概述:为什么H5里嵌地图不是“加个iframe”就完事了? “H5显示地图和标注坐标(高德地图)”——这行标题看着简单,但我在过去三年带过的十几个前端项目里,至少有七成卡在这一步:页面能加载…

2026/10/14 10:22:22 阅读更多 →
SNMP选型实战:Net-SNMP与XXLSNMP SDK的工程对比

SNMP选型实战:Net-SNMP与XXLSNMP SDK的工程对比

SNMP算是网络管理领域最“老资格”的协议了,基础到很多人都不愿意讨论它。但真到要做设备纳管、做网管平台、往网关里塞Agent的时候,SNMP实现选哪家,直接影响后面几个月的开发和维护成本。我在某个网管平台项目中,把XXLSNMP SDK和…

2026/10/14 10:22:22 阅读更多 →

最新新闻

Towards Automated Regulatory Compliance Verification in Financial Auditing with Large Language Mo...

Towards Automated Regulatory Compliance Verification in Financial Auditing with Large Language Mo...

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现财务审计中监管合规性的自动验证,旨在解决传统审计中人工验证合规性的低效问题。研究对比了开源LLMs(如Llama-2系列)与专有LLMs(如OpenAI的GPT系列)在合规性检测中的性能,使用了普华永道(PwC)提供的两个自定义…

2026/10/14 20:48:13 阅读更多 →
A Versatile Pathology Co-pilot via Reasoning Enhanced Multimodal Large Language Model

A Versatile Pathology Co-pilot via Reasoning Enhanced Multimodal Large Language Model

文章主要内容和创新点总结 主要内容 本文提出了一种名为SmartPath-R1的多模态大型语言模型(MLLM),旨在解决计算病理学中现有模型推理能力有限、任务适应性单一的问题。该模型能够同时处理区域感兴趣(ROI)级别和全切片图像(WSI)级别的任务,包括分类、检测、分割和视觉…

2026/10/14 20:48:13 阅读更多 →
The Pluralistic Moral Gap: Understanding Judgment and Value Differences between Humans and Large ...

The Pluralistic Moral Gap: Understanding Judgment and Value Differences between Humans and Large ...

文章主要内容总结 本文聚焦大型语言模型(LLMs)与人类道德判断的差异,通过构建真实世界道德困境数据集,系统分析了二者在道德判断分布和价值观表达上的“多元道德差距”,并提出了缩小该差距的方法。具体内容如下: 数据集构建:创建了包含1618个真实世界道德困境的“道德困…

2026/10/14 20:48:13 阅读更多 →
GBS光子采样加速稠密子图搜索:图论难题的量子启发式解法

GBS光子采样加速稠密子图搜索:图论难题的量子启发式解法

1. 这不是量子计算科普,而是一次图论问题的“量子启发式突围” 你可能在最近几篇预印本论文或某次学术分享中见过这个标题:“Gaussian Boson Sampling for finding dense subgraphs”。它听起来像一个典型的交叉学科缝合怪——把高能物理里的玻色采样、量…

2026/10/14 20:48:13 阅读更多 →
风电功率预测的精度密码:输入稳定性硬指标建设指南

风电功率预测的精度密码:输入稳定性硬指标建设指南

1. 数据还是模型:先搞清楚精度瓶颈到底在哪先说一个我自己的感受。入行风电功率预测这几年,身边绝大多数团队把精力都砸在模型结构上:今天换一套神经网络,明天堆一个集成学习,后天又有人说注意力机制效果好。每次模型迭…

2026/10/14 20:48:13 阅读更多 →
基于STM32的简易四轴飞行器:硬件选型、姿态解算与PID调参全攻略

基于STM32的简易四轴飞行器:硬件选型、姿态解算与PID调参全攻略

简介:基于STM32的直流电机速度环PID闭环控制资源包,面向嵌入式初学者与电子类课程设计学生,帮助理解反馈控制原理并解决直流电机调速中的闭环实现问题。压缩包共204个文件,主要由C源文件、H头文件、Keil工程配置文件(u…

2026/10/14 20:47:12 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →