Infernux 着色模型与 GLSL 实战:打造 PBR、卡通与自定义光照
游戏开发图形学3D渲染【免费下载链接】InfernuxBuilding a Neural Network-Native Engine (3N). Python authoring, C runtime, Vulkan/WebGPU. Windows, Linux, Android and Web.项目地址https://gitcode.com/gh_mirrors/in/Infernux点击查看免费下载Infernux 是面向神经网络的跨平台游戏引擎其着色系统让一套 GLSL 光照代码同时服务 PBR、卡通Toon与自定义风格。本文面向新手带你从内置 PBR 材质入手理解 ShadingModel 契约再到三步写出自己的卡通着色模型与 GLSL 函数库。一、先看懂 Infernux 的渲染分工在 Infernux 里一个物体从贴图 参数变成屏幕上的像素要经过一条清晰的链路角色文件负责什么Material.mat保存参数值Base Color、Metallic…顶点阶段.vert顶点最终位置片元阶段.frag采样贴图组装SurfaceData着色模型.shadingmodel定义表面如何响应光照函数库.glsl可复用的数学函数关键洞察材质只描述表面是什么ShadingModel 才决定光照怎么打。所以同一个卡通材质可以无感地跑在 Forward、Forward 甚至 Deferred 管线上——路由由管线决定光照算法不用改一行代码。二、SurfaceData材质与光照之间的信封片元阶段surface()产出的是一份固定结构的SurfaceData它像一封装好数据的信封交给shading()struct SurfaceData { vec3 albedo; // 基础色 vec3 normalWS; // 世界空间着色法线 float metallic; // 金属度 float smoothness; // 光滑度 float occlusion; // 环境遮蔽 vec3 emission; // 自发光 float alpha; // 透明度 float specularHighlights; float shadingParam0; // 留给模型自定义的标量 float shadingParam1; };注意shadingParam0/1这两个预留槽位——后面做卡通光照时阈值和柔和度就存在这里而且它们能原样穿过 GBufferDeferred 管线这是自定义模型能否支持 Deferred 的关键。官方教程中完整的契约说明见 shading-models-glsl.md。三、内置 PBR工业级光照长什么样Infernux 内置的 PBR 着色模型实现了完整的 Cook-TorranceGGXBRDF源码可以直接读是极好的学习样本pbr.shadingmodel一个shading()服务所有渲染路径pbr.glslGGX NDF、Smith 可见性、Schlick 菲涅尔、多重散射能量补偿lit.frag配套的材质属性与 Surface 组装它的核心流程非常值得模仿void shading(in SurfaceData s, out vec4 color) { ShadingContext ctx GetShadingContext(); // 1. 读引擎上下文 vec3 N normalize(s.normalWS); vec3 V normalize(ctx.cameraPositionWS - ctx.positionWS); Light mainLight getMainLight(...); // 2. 取主方向光 vec3 Lo calculateAllLighting(...); // 3. 遍历所有直接光 vec3 ambient ...; // 4. 环境漫反射 镜面 color vec4(ambient Lo s.emission, s.alpha); // 5. 合成输出 }两个容易踩坑的细节normalWS的零向量是哨兵。材质没写法线时保持为(0,0,0)管线适配器会在surface()之后自动替换成几何法线。如果你在surface()里提前normalize会把哨兵信号毁掉。metallic为 0 时 F0 固定 0.04。这是非金属的菲涅尔基准金属度插值出反射率起点。四、内置 Toon两行参数就能做卡通描边感内置卡通模型 toon.shadingmodel 用smoothstep实现色阶banding比硬step更柔和float toonStep(float value, float threshold, float softness) { float width max(softness, 0.0001); return smoothstep(threshold - width, threshold width, value); }它把材质面板的diffuseThreshold和bandSoftness分别放进shadingParam0/1再对方向光、点光、聚光、面光逐一循环调用同一个evaluateToonLight()。配套的 toon.frag 只负责把属性送进 SurfaceDatas.shadingParam0 material.diffuseThreshold; s.shadingParam1 material.bandSoftness;想快速出效果直接在 Material Inspector 里把 Fragment 选成内置Toon拖一个Cube赋材质调整diffuseThreshold在 0.2~0.8 之间色阶会实时移动。五、实战三步构建你自己的Learn Band模型官方教程给了一个最小可运行的自定义模型跟着做即可。在Assets/Shaders/LearnBand/下创建三个文件注意.glsl和.shadingmodel目前需要手动用文本编辑器创建Project 面板只内置.frag/.vert的创建命令1️⃣learn_band_math.glsl— 可复用数学库ShaderInfo { Name Learn Band Math } float learnBand(float ndl, float threshold) { return mix(0.25, 1.0, step(threshold, ndl)); }2️⃣learn_band.shadingmodel— 光照入口ShadingModelInfo { Name Learn Band Imports [Lighting, Learn Band Math] Requires [Lighting] } void shading(in SurfaceData s, out vec4 color) { ShadingContext ctx GetShadingContext(); vec3 N normalize(s.normalWS); Light mainLight getMainLight(ctx.positionWS, N, ctx.viewDepth); float ndl max(dot(N, mainLight.direction), 0.0); float band learnBand(ndl, clamp(s.shadingParam0, 0.0, 1.0)); vec3 radiance mainLight.color * mainLight.attenuation * mainLight.shadow; color vec4(s.albedo * radiance * band s.emission, s.alpha); }3️⃣learn_band_surface.frag— 面向 Material 的表面ShaderInfo { Name Learn Band Surface ShadingModel Learn Band Surface Opaque Queue 2000 Properties { Color baseColor [0.9, 0.3, 0.08, 1.0] Float threshold 0.55 Range(0.0, 1.0) } } void surface(out SurfaceData s) { s InitSurfaceData(); s.albedo material.baseColor.rgb; s.shadingParam0 material.threshold; }依赖关系一目了然Material → Learn Band Surface --ShadingModel-- Learn Band --Imports-- Lighting / Learn Band Math。运行验证四步Project 面板重新导入.frag→ 创建 Material 并把 Fragment 指到Learn Band Surface→ Cube 赋材质 → 拖动thresholdConsole 无错且硬边色阶移动即为成功。六、排查与进阶常见故障速查表现象大概率原因shader import not foundImports里的 Name 拼写错误或 ID 不存在Name 区分大小写改.glsl/.shadingmodel画面不变运行时重载只认.vert/.frag需 touch 或重新导入根.fragLight/getMainLight编译失败删了Imports [Lighting]或漏了Requires [Lighting]画面还是旧效果上一份有效 Program 仍在回退Console 清空 故意改参数才证明新程序生效想让模型支持 Deferred编译器只在shading()签名合法且没有声明Unsupported [Deferred]时才授予 Deferred 资格。标准 GBuffer 只保留上面列出的 SurfaceData 字段——如果你的自定义数据塞不进shadingParam0/1、或者依赖切线框架内置六向体积光 six_way_smoke.shadingmodel 就是典型请显式声明退出引擎会自动走 Forward 回退路径ShadingModelInfo { Name SixWaySmoke Imports [Lighting] Requires [Lighting] Unsupported [Deferred] }保持边界清晰.frag只管材质属性与纹理不写光照.shadingmodel只管SurfaceData× 光照的交互.glsl只管纯函数不携带任何渲染路径策略这样光照代码保持可读路由决策留在管线的领地。更多细节可阅读官方教程 shading-models-glsl.md、fragment-materials.md以及课程索引 rendering-course.json。赞分享游戏开发图形学3D渲染【免费下载链接】InfernuxBuilding a Neural Network-Native Engine (3N). Python authoring, C runtime, Vulkan/WebGPU. Windows, Linux, Android and Web.项目地址https://gitcode.com/gh_mirrors/in/Infernux点击查看免费下载相关推荐Music Player GO性能优化技巧确保流畅播放体验的完整指南Music Player GO性能优化技巧确保流畅播放体验的完整指南 你是否正在寻找一款轻量级但功能强大的Android音乐播放器 Music Play移动开发音视频three.js 卡通着色核心源码解析ToonLightingModel 光照模型与 gradientMap 离散色阶实战three.js 卡通着色核心源码解析ToonLightingModel 光照模型与 gradientMap 离散色阶实战 ToonLightingModel前端3D渲染图形学three.js TSL 物理光照模型解析PhysicalLightingModel 的构造、PBR 特性开关与着色器管线实现three.js TSL 物理光照模型解析PhysicalLightingModel 的构造、PBR 特性开关与着色器管线实现 PhysicalLightin前端3D渲染图形学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

陈德炼:做 B2B 垂直 AI,第一性任务是变成客户的同类|TaoToken 统一 Key 打通 LLM 与 RPA 落地

陈德炼:做 B2B 垂直 AI,第一性任务是变成客户的同类|TaoToken 统一 Key 打通 LLM 与 RPA 落地

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

2026/10/12 0:35:17 阅读更多 →
从 OpenClaw 到 Hermes:会自己长大的 AI 代理,TaoToken 统一 Key 怎么接

从 OpenClaw 到 Hermes:会自己长大的 AI 代理,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/12 0:35:17 阅读更多 →
VMware NAT模式虚拟机端口转发到宿主机:两种配置方法与排查指南

VMware NAT模式虚拟机端口转发到宿主机:两种配置方法与排查指南

1. 先把这张网络拓扑图看明白:这个需求到底在解决什么问题先说结论:你要做的事情,就是把一台运行在VMware NAT网络里的虚拟机,它的9980端口“搬”到宿主机上,让局域网里其他电脑通过访问宿主机IP就能用上这个端口背后的…

2026/10/12 0:34:17 阅读更多 →

最新新闻

实验中心器材管理系统设计与实现:从需求分析到答辩全记录

实验中心器材管理系统设计与实现:从需求分析到答辩全记录

/* 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 2:59:42 阅读更多 →
深入解读 go-git:纯 Go 实现的 Git 操作库及其在 Devtron 中的落地实践

深入解读 go-git:纯 Go 实现的 Git 操作库及其在 Devtron 中的落地实践

云原生DevOps运维 【免费下载链接】devtron The only Kubernetes dashboard you need 项目地址: https://gitcode.com/gh_mirrors/dev/devtron 点击查看 免费下载 导读 本文围绕 Devtron 仓库 vendored 的 go-git v5(版本号为 v5.19.1,见 g…

2026/10/13 2:59:42 阅读更多 →
C++静态数组插入原理:从内存连续性理解挪动操作

C++静态数组插入原理:从内存连续性理解挪动操作

/* 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 2:59:42 阅读更多 →
mirrord copy_target 详解:用副本 Pod 稳定调试不可靠的 Kubernetes 目标,以及 scale_down 整负载替换

mirrord copy_target 详解:用副本 Pod 稳定调试不可靠的 Kubernetes 目标,以及 scale_down 整负载替换

开发工具云原生CLI 【免费下载链接】mirrord Run any process, on your machine or in an AI agents environment, as if it were a pod in your Kubernetes cluster: real env vars, DNS, network, traffic. 项目地址: https://gitcode.com/gh_mirrors/mi/mirrord …

2026/10/13 2:59:42 阅读更多 →
贪心算法实战:智力大冲浪任务调度与惩罚最小化

贪心算法实战:智力大冲浪任务调度与惩罚最小化

/* 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 2:59:42 阅读更多 →
Mathesar 用户数据类型(User Data Type)完全指南:引用、显示、默认值与编辑追踪

Mathesar 用户数据类型(User Data Type)完全指南:引用、显示、默认值与编辑追踪

数据库后端前端协作 【免费下载链接】mathesar An intuitive spreadsheet-like interface that lets users of all technical skill levels view, edit, query, and collaborate on Postgres data directly. 100% open source and self hosted, with native Postgres access co…

2026/10/13 2:58:42 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →