资讯详情

Infernux 着色模型与 GLSL 实战:打造 PBR、卡通与自定义光照

📅 2026/10/12 0:35:59 | 华诺云谱 👁 阅读
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),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑