Ray渲是一个基于物理的渲染库,采用了UE4的IBL曲面拟合以及CE5光照模型(BRDF GGX), 以更贴合物理的方式渲染MMD,该渲染需求MMD版本为926(低于926版本无法正确计算IBL), 以及MME版本037,并且关闭MMD自带的抗锯齿。
http:https://www.linfo.org/mitlicense.html
- 添加了SphereLight IBL [(预览)](https://github.com/ray-cast/ray-mmd/raw/1.1.0beta/Tutorial/05-SphereLight IBL/README.jpg)
- 改进了Bloom
- 改进了SphereFog
- 添加了旧版本的BloomTonemapping
- 修复使用ALBEDO_MAP_APPLY_DIFFUSE时多次乘算扩散色
- 改进了FXAA
- 修复了GroundFog和AtmosphericFog载入错误
- 注 : 法线贴图效果和SP(NormalMap使用OpenGL模式)保持一致,如果凹凸颠倒设置normalMapScale = -1.0;
- 独立GroundFog, 添加SphereFog (预览)
- 添加DirectionalLight
- 添加Gbuffer过滤用于减少IBL的锯齿 (预览)
- 改进NormalMap (预览)
- 改进ParallaxMap (预览)
- 改进SSAO,以及近处时出现的白边 (预览)
- 优化多光源的运算速度
- 纹理LOD采样方式改为各向异性16x
- 修复使用NORMAL_MAP_UV_FLIP时法线凹凸颠倒
IBL(Image-based-lighting)基于图片的光,需要对图片做一些处理,使其能够让天空球作为一个大
的光源,因此不同的天空球光照效果也是不一样的,也自然会产生出不同的色调(如下图):
假设白炽灯,远光灯,太阳,都是白色的,但很明显虽然都是白色,太阳是最刺眼的,其次远光灯
这样只用RGB来描述光的颜色是远远不够的,需要一个光强来描述颜色的强度,对此jpg,png,tga这类
颜色最大只有255(整数时是 0 ~ 255, 浮点时是0.0 ~ 1.0)的并不是HDR(High-dynamic-range).
因此IBL的图片最好使用支持颜色大于255的文件(dds, hdr),这样光照效果会显得更亮,立体感更强,
画面也不会灰,越亮的区域产生的bloom也会越大(以下是没有使用HDR效果):
- Extension : 添加一些额外的
- Lighting : 多光源相关特效
- Main : 添加物体基本的光照
- Materials : 用于指定物体材质 (如皮肤,金属,天空盒....)
- Shader : ray.x所需要的代码(不要挂载里面的文件)
- Shadow : 用于渲染物体阴影的特效(注:取消AO可以在DepthMap板块挂depth_nossao.fx)
- Skybox : 基本的天空盒特效和纹理
- Tools : 制作天空盒需要用到的工具
- Tutorial : 一些比较进阶的教程
- ray.conf : 配置文件(可自行修改)
- ray.x : 渲染主文件
- ray_controller.pmx : 调整光强,SSAO,泛光..等效果
- 将ray.x拖拽到MMD中, 并且关闭MMD自带的抗锯齿
- 添加Skybox/skybox.pmx,检查MaterialMap中是否挂载了material_skybox.fx
- 在EnvLightMap板块中对skybox.pmx赋予天空球目录中的skylighting_hdr.fx
- 添加任意模型到MMD,并在Main板块选择Main.fx
- 在MaterialMap板块中,对刚载入的模型在Materials文件夹中选择对应的材质
- 最后将天空盒渲染顺序调至第一位,分配完后效果图 (流程图) :
因为考虑跨地区,文本统一使用了UTF8的编码,使用系统自带记事本的修改保存会导致出错, 建议下载文本编辑器(notepad++, visual studio code, sublime text3) 编辑器来修改
- Albedo(物体的贴图色)
- Albedo是描述光线与材质的反照率,与DiffuseMap区别在于没有高光和环境光遮蔽
- 编写自定义材质时需要将USE_CUSTOM_MATERIAL设置成 1
- 默认时材质是启用贴图的,贴图使用PMX中模型的纹理
- 指定自定义纹理需要将ALBEDO_MAP_IN_TEXTURE设置成0(既不使用PMX模型中的贴图)
- 然后修改ALBEDO_MAP_FILE的路径,路径可以使用相对/绝对路径 (不要带有中文, 路径分割""改为"/")
- 使用GIF/APNG做为纹理需要将ALBEDO_MAP_ANIMATION_ENABLE设置成1 (播放时图片才会动)
- ALBEDO_MAP_ANIMATION_SPEED可以控制播放的速度,但最小播放速度为1倍速
- ALBEDO_MAP_APPLY_COLOR设置1可以将自定义颜色乘到贴图上, ALBEDO_MAP_APPLY_DIFFUSE则是PMX文件中的扩散色
- ALBEDO_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- const albedoLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- NormalMap(法线贴图)
- SubNormalMap(多层法线材质)
- 用于在主法线或没有法线的基础上添加一些噪音法线贴图,类似给皮肤加粗糙毛孔, 使用方法和法线贴图一致
- NORMAL_MAP_SUB_ENABLE 设置1时启用贴图
- NORMAL_MAP_SUB_UV_FLIP 设置1时水平翻转纹理坐标
- NORMAL_MAP_SUB_FILE 启用贴图时使用的贴图路径
- const float normalMapSubScale = 1.0; 法线的强度(贴图凸凹颠时可以设置成 -1.0)
- const float normalMapSubLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- Smoothness(光滑度)
- 描述物体在微观表面的光滑程度
- SMOOTHNESS_MAP_ENABLE 设置1时启用贴图
- SMOOTHNESS_MAP_IN_TOONMAP 设置1时使用PMX中的Toon贴图 (需要先启用SMOOTHNESS_MAP_ENABLE)
- SMOOTHNESS_MAP_IS_ROUGHNESS 设置1时贴图是粗糙度而不是光滑度
- SMOOTHNESS_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- SMOOTHNESS_MAP_SWIZZLE 指定贴图使用的颜色通道 (R = 0, G = 1, B = 2, A = 3, 灰度图不需要指定)
- SMOOTHNESS_MAP_FILE 启用贴图时使用的贴图路径
- const float smoothness = 0.0; 取值范围0 ~ 1 (0 = 粗糙,1 = 光滑)
- const float smoothnessMapLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- Metalness(金属程度)
- 描述物体的金属程度是一个在绝缘体,半导体,和导体的插值
- METALNESS_MAP_ENABLE 设置1时启用贴图
- METALNESS_MAP_IN_TOONMAP 设置1时使用PMX中的Toon贴图 (需要先启用METALNESS_MAP_ENABLE)
- METALNESS_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- METALNESS_MAP_SWIZZLE 指定贴图使用的颜色通道 (R = 0, G = 1, B = 2, A = 3, 灰度图不需要指定)
- METALNESS_MAP_FILE 启用贴图时使用的贴图路径
- const float metalness = 1.0 取值范围在0 ~ 1,0为绝缘体,1表示导体(金属)
- const float metalnessMapLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- const float metalnessBaseSpecular = 0.04; 指定物体反射系数 (添加这个值可以增加金属性,0.0时物体不反射IBL的specular)
- Sub Surface Scattering(次表面散射)
- 描述物体散射色,用于渲染皮肤,玉器时使用的
- SSS_ENABLE 设置1时启用次表面散射
- SSS_MAP_ENABLE 设置1时启用贴图
- SSS_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- SSS_MAP_APPLY_COLOR 设置1时将const float3 transmittance = 0.0;的颜色乘算到贴图色上
- SSS_MAP_FILE 启用贴图时使用的贴图路径
- const float3 transmittance = 0.0; 散射色,皮肤可以使用例如 float3 transmittance = float3(0.1, 0.0, 0.0);
- const float transmittanceStrength = 0.0f; 用于指定SSS的强度 (0 ~ 0.9999 代表玉器,1.0 ~ 1.999代表皮肤)
- const float transmittanceMapLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- Melanin(黑色素)
- 可以使物体渲染的更黝黑一些,显得不那么白,SSS中的截图因为使用了Melain, 所以会看起来像鸡蛋
- MELANIN_MAP_ENABLE 设置1时启用贴图
- MELANIN_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- MELANIN_MAP_SWIZZLE 指定贴图使用的颜色通道 (R = 0, G = 1, B = 2, A = 3, 灰度图不需要指定)
- MELANIN_MAP_FILE 启用贴图时使用的贴图路径
- const float melanin = 0.0; 取值范围0 ~ inf (如果贴图色很白时产生的黑色素会越少)
- const float melaninMapLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- Emissive(自发光贴图)
- 自发光贴图需要把要发光的那部分做成和UV对应的贴图
- EMISSIVE_ENABLE 设置1时启用自发光,使用时必须先启用这个
- EMISSIVE_USE_ALBEDO 设置1时使用Albedo的参数代替自发光参数,但可以使用EMISSIVE_APPLY_COLOR 和 EMISSIVE_APPLY_MORPH_COLOR
- EMISSIVE_MAP_ENABLE 设置1时启用贴图
- EMISSIVE_MAP_IN_TEXTURE 设置1时使用PMX模型中的贴图
- EMISSIVE_MAP_IN_SCREEN_MAP 使用MMD中的屏幕贴图/AVI贴图,需要先载入扩展目录中的DummyScreen.x
- EMISSIVE_MAP_ANIMATION_ENABLE 设置1时贴图是一个GIF/APNG图片
- EMISSIVE_MAP_ANIMATION_SPEED GIF/APNG的播放速度,最小为1倍速
- EMISSIVE_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- EMISSIVE_APPLY_COLOR 设置1时将const float3 emissive = 1.0;乘算到贴图色,用于修改贴图色
- EMISSIVE_APPLY_MORPH_COLOR 表情中的颜色(多光源需要用到的参数)
- EMISSIVE_APPLY_MORPH_INTENSITY 表情中的颜色强度(多光源需要用到的参数)
- EMISSIVE_MAP_FILE 启用贴图时使用的贴图路径
- const float3 emissive = 1.0; 自发光的颜色,可以改为 float3 emissive = float3(0.1, 0.0, 0.0);
- const float emissiveIntensity = 1.0; 自发光的强度,强度越大Bloom越大
- const float emissiveMapLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- Parallax(视差贴图)
- 视差贴图可以使物体具备更好的凹凸感
- PARALLAX_MAP_ENABLE 设置1时启用贴图
- PARALLAX_MAP_UV_FLIP 设置1时水平翻转纹理坐标
- PARALLAX_MAP_SUPPORT_ALPHA 设置1时对Alpha贴图有效
- PARALLAX_MAP_FILE 启用贴图时使用的贴图路径
- const float parallaxMapScale = 0.01; 高度的缩放强度
- const float parallaxMapLoopNum = 1.0; 贴图的迭代次数 (参见法线贴图)
- 解压Tools目录中的cmft.rar
- 选择一张hdr文件, 并改名为skybox.hdr, 然后拖拽到exe上
- 如果文件格式是正确的将会进行处理,效果如下
- 程序运行完后会多出skydiff_hdr.dds和skyspec_hdr.dds文件
- 最后在Skybox目录,复制出任意一个天空球,将skybox.hdr, skydiff_hdr.dds, skyspec_hdr.dds 覆盖到新目录中的texture目录
- 内置的光源有点光源、聚光灯、球形光源、方形区域光 以及 管状光源,但目前不会产生阴影
- 以最基本的点光源介绍,首先载入ray、skybox,以及一个地面模型
- 在Lighting目录中拖拽一个PointLight.pmx至窗口中
- 检查MME面板中,LightingMap板块是否有挂在point_lighting.fx (如果没有,挂载上去)
- 然后修改表情中的RGB+和Radius+调到最大,效果如图
- 光源需要阴影可以在LightMap中选择point_lighting_s0.fx(s代表阴影,0代表质量)
- 其它光源操作方式和点光源差不多,一些宽度、高度、范围、半径、都在表情右下角
- 光源自发光,可以在MME的MaterialMap选择一个material_lighting.fx 给 PointLight.pmx
- 需要更多的光源只需要将PointLight.pmx复制一份即可,其它光源同理
- 接着说下如何使用纹理的方形区域光
- 首先在Lighting目录中拖拽一个RectangleLight.pmx至窗口
- 检查MME面板中,LightingMap板块是否有挂在rectangle_lighting.fx (如果没有,挂载上去)
- 然后修改表情中的RGB+和Width/Height,以及将Range+调到最大,效果如图
- 修改rectangle_lighting.fx中的视频贴图,修改后保存 (可复制一份,复制的同时要挂载新的fx)
- 复制一份material.fx改为material_xxxxx.fx
- 将USE_CUSTOM_MATERIAL改为 1,const float3 albedo = 1.0; 改为 0.0;
- 将发光贴图进行如下设置,修改后保存
- 最后在MME里MaterialMap将material_xxxxx.fx以及Main中main.fx赋予给RectangleLight.pmx效果如图
- 如果图片是GIF/APNG格式的纹理可以设置
- (VIDEO / ALBEDO / EMMISIVE) _MAP_ANIMATION_ENABLE 启用GIF/APNG动画
- (VIDEO / ALBEDO / EMMISIVE) _MAP_ANIMATION_SPEED 控制播放速度 (最小倍率为1)
- LED并且支持视频/屏幕纹理的播放
- 将Lighting目录中的DummyScreen.x 载入
- 在菜单->背景->加载AVI文件 (注 此为可选项,此外AVI文件可以使用MMBG插件载入非avi格式视频)
- 然后选择菜单->背景->(全画面/AVI背景)
- 最后将RectangleLight.pmx在LightMap板块选择LED.fx,在MaterialMap板块选择material_led.fx即可
- DirectLight+/-直接光照中整体光强
- SSAO+- 环境光遮蔽强度
- SSAO Radius+- 环境光遮蔽的范围
- EnvDiffLight+-环境光的漫反射光强
- EnvSSSLight+-环境光的次表面散射光强
- EnvSpecLight+-环境光的镜面光强
- EnvRotateX/Y/Z 旋转天空盒的X/Y/Z轴
- EnvShadow 主光源阴影用于环境光阴影的强度
- BloomThreshold 提取最亮部分的阈值
- BloomRadius 产生泛光的大小
- BloomIntensity 泛光的整体强度
- BloomToneMapping 色调映射的模式 (为0时ACES709, 为1时线性映射)
- Vignette 窗口四周的暗角(虚角)
- Exposure 曝光强度
- Dispersion 相机色散的效果
- DispersionRadius 相机色散的区域大小
- ToneMapping 色调映射的模式 (为0时ACES709, 为1时线性映射)
- BalanceR/G/B 色彩平衡
- 添加了区域光的阴影 (点光源阴影的模拟)
- 添加了EMISSIVE_APPLY_MORPH_INTENSITY用于多光源强度的调节
- 还原Tonemapping
- 改进Bloom和自发光
- 改进光源的衰减 (更加贴合物理的衰减行为)
- 修复光源大于一定距离产生的bug
- 修复过暗的场景出现的颜色梯度
- 改进Bloom
- 修复DirectionalLight+表情的Bug
- 添加点光源的阴影
- 改进bloom的范围,使其产生更大的bloom (预览1) (预览2) (预览3)
- 改进SSAO近处出现布线
- 修复MMD输出png图片错误的透明通道问题
- 修复同时启用SSS和Emissive时Emissive无效
- 修复在Material.fx中Toon拼写为Tone的错误
- 添加了新的cmft过滤工具,只支持hdr, dds, ktx, tga文件 (使用方法1) (使用方法2)
- 添加MultiLight+/-和EnvSSSLight+/-在表情中
- 添加Contrast+/-调节对比度在表情右下角中
- 添加简单的金属材质
- 添加多光源的透明物体支持
- 添加了更高的阴影质量4和5
- 改进主光源的阴影
- 注1 : 此版本不可以和1.0.7覆盖,旧的PMM需要在DepthMap和PSSM里Skybox挂上对应的材质
- 注2 : 1.0.8版会出多光源的透明物体支持,正确的天空盒反射计算,以及代替cmftstudio的工具
- 添加了地板反射,修改ray.conf 的 OUTDOORFLOOR_QUALITY (使用方法)
- 添加了xxx_noalpha.fx用于优化不需要计算alpha的物体 (使用方法)
- 添加PMX中specular power大于200时自动发光,使用PMX中的specular color
- 添加BloomTonemapping表情
- 调整了IBL spec的曲线
- 调整了光源目录布局,添加了聚光灯的简单材质 (使用方法)
- 天空盒大小改为PMXEditor调整
- 材质中还原了自定义Alpha
- 材质添加EmissiveIntensity,指定发光强度
- 材质添加alphaThreshold大于以上阈值认为不是透明物体
- 独立出FilmGrain
- 改进了FXAA
- 改进了SSAO的强度曲线,且可以在DepthMap中指定不产生SSAO的物体 (使用方法)
- 改进了主光源阴影
- 改进BokehBlur(暂时没用,改进中)
- 修复部分显卡使用带有阴影的SpotLight会编译错误
- 修复部分显卡使用RectangleLight会编译错误
- Moving to the Next Generation - The Rendering Technology of Ryse
- ACES Filmic Tone Mapping Curve
- Compact Normal Storage for small G-Buffers
- Convert Blinn-Phong to Beckmann distribution
- Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel
- Physically Based Area Lights
- Physics and Math of Shading
- Compact YCoCg Frame Buffer for small IBL-Buffer
- RGBM color encoding
- Horizon Occlusion for IBL
- Screen space glossy reflections
- Parallax Occlusion Map