Appearance
后处理
后处理通常是在整个场景渲染完成后应用的,而不是直接作用于特定的物体。它可以用来添加全局的效果,比如模糊、色彩校正、光照效果等。所以,后处理效果会影响整个场景,而不是单个物体。
babylon.js 的 postProcess 特性允许创建自定义的后期处理效果,并将其应用到场景中。可以通过组合不同的后期处理效果来创建出独特的视觉风格。
包括但不限于:
1、全局色调映射(Global Tone Mapping):调整场景的色调映射,使其在不同的光照条件下看起来更自然。
2、景深效果(Depth of Field):模拟相机的景深效果,使得场景中某些物体或区域模糊,增强真实感。
3、运动模糊(Motion Blur):根据物体的运动模糊化图像,使得动态物体在场景中呈现出更加流畅的运动效果。
4、像素化(Pixelation):将图像像素化,使得图像呈现出像素风格的效果。
5、高斯模糊(Gaussian Blur):应用高斯模糊来柔化图像,常用于创建光晕或柔化阴影效果。
6、HDR(High Dynamic Range)效果:增强图像的动态范围,使得在亮度和对比度方面更接近人眼的感知。
7、折射和反射(Refraction and Reflection):通过对图像进行折射和反射处理,实现逼真的水面效果或玻璃材质效果。
8、图像混合(Image Blending):将多个图像混合在一起,创建出各种视觉效果。
9、颜色校正:通过调整图像的亮度、对比度、饱和度等参数,来改变场景的整体色调。
10、深度模糊:根据场景中的深度信息,对远处的物体应用模糊效果,以增强近处物体的焦点。
11、光晕和泛光:为场景中的光源添加光晕或泛光效果,使其更加明亮和引人注目。
12、屏幕空间反射:模拟物体表面的反射效果,增加场景的真实感。
13、自定义效果:通过编写自定义的 GLSL 着色器代码,创建出独特的后期处理效果。
BABYLON.PostProcess参数:
name (string): 后处理效果的名称,用于标识该效果。
fragmentUrl (string): 包含着色器代码的文件路径。这个着色器文件包含了后处理的逻辑,通常是一个片段着色器 (fragment shader)。
parameters (Nullable<string[]>): 一个包含后处理着色器所需参数名称的数组。这些参数在着色器中声明为uniform变量,以便JavaScript代码可以动态地更新它们。
samplers (Nullable<string[]>): 一个包含了纹理采样器名称的数组,这些采样器在着色器中声明为uniform变量。通常用于传递纹理给后处理效果。
options (number | PostProcessOptions): 一个可选的参数,用于控制后处理效果的运行。可以是一个数值或一个对象,具体取决于需要的配置。计算渲染过程之前要缩小到的所需宽度/高度比。(使用1.0表示全尺寸) camera (BABYLON.Camera): 与后处理效果相关联的摄像机对象。后处理效果会应用于该摄像机所看到的场景。
后处理---改变场景背景色
BABYLON.PostProcess的简单示例
javascript
const postProcess = new BABYLON.PostProcess('CustomPostProcess', './custom', ['time'], null, 1.0, camera)
postProcess.onApply = function(effect) {
effect.setFloat('time', performance.now() / 1000)
}
//'./custom'是引入以下两个文件
//---------------------------------------------------------
// 创建custom.fragment.fx文件
// Fragment Shader
precision highp float;
varying vec2 vUV;
uniform float time;
void main(void) {
vec2 uv = vUV;
vec3 color = vec3(0.0);
color.r = abs(sin(time));
color.g = abs(cos(time));
color.b = abs(sin(time * 0.5));
gl_FragColor = vec4(color, 1.0);
}
//---------------------------------------------------------
// 创建custom.vertex.fx文件
// Vertex Shader
precision highp float; //所有float类型数据的精度是highp
attribute vec3 position;
attribute vec2 uv;
uniform mat4 worldViewProjection;
varying vec2 vUV;
void main(void) {
gl_Position = worldViewProjection * vec4(position, 1.0);
vUV = uv;
}
后处理---景深效果
BABYLON.DepthOfFieldEffect 是一个后处理效果。Depth of Field (DOF) 模糊效果通常用于模拟摄像机镜头焦距调整时的景深效果。
javascript
const box = BABYLON.MeshBuilder.CreateBox('box', {
size: 2
}, scene)
const material = new BABYLON.StandardMaterial('material', scene)
box.material = material
// 创建景深效果的后期处理
const depthOfField = new BABYLON.DepthOfFieldEffect(camera)
// 创建渲染管道并将后期处理效果添加到管道中
const pipeline = new BABYLON.DefaultRenderingPipeline('default', true, scene)
pipeline.depthOfFieldEnabled = true
pipeline.depthOfField = depthOfField
后处理---像素化效果
BABYLON.PixelationPostProcess 是 Babylon.js 中的一个后期处理效果,它用于将图像的细节像素化,即减少图像的分辨率以产生类似像素艺术(pixel art)的视觉效果。当将这个后期处理应用到场景上时,场景中的物体将看起来像是由大块的像素块组成,而不是平滑的纹理和颜色过渡。
javascript
// 创建一个盒子
const box = BABYLON.MeshBuilder.CreateBox('box', {size: 2}, scene);
// 应用材质
const material = new BABYLON.StandardMaterial('material', scene);
box.material = material;
// 创建像素化效果的后期处理
const pixelationEffect = new BABYLON.PostProcessRenderEffect(engine, 'pixelation', function () {
return new BABYLON.PixelationPostProcess('pixelation', 10, camera);
});
// 将像素化效果添加到默认渲染管道中
const pipeline = new BABYLON.DefaultRenderingPipeline('default', true, scene);
pipeline.addEffect(pixelationEffect);