UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

44 lines (41 loc) 1.87 kB
import { SHADERLANGUAGE_GLSL, SHADERLANGUAGE_WGSL, SEMANTIC_POSITION } from '../../platform/graphics/constants.js'; import { RenderPassShaderQuad } from '../../scene/graphics/render-pass-shader-quad.js'; import { ShaderUtils } from '../../scene/shader-lib/shader-utils.js'; import glslCocPS from '../../scene/shader-lib/glsl/chunks/render-pass/frag/coc.js'; import wgslCocPS from '../../scene/shader-lib/wgsl/chunks/render-pass/frag/coc.js'; import { ShaderChunks } from '../../scene/shader-lib/shader-chunks.js'; class RenderPassCoC extends RenderPassShaderQuad { execute() { const { paramsValue, focusRange } = this; paramsValue[0] = this.focusDistance + 0.001; paramsValue[1] = focusRange; paramsValue[2] = 1 / focusRange; this.paramsId.setValue(paramsValue); const camera = this.cameraComponent.camera; this.cameraParamsId.setValue(camera.fillShaderParams(this.cameraParams)); super.execute(); } constructor(device, cameraComponent, nearBlur){ super(device); this.cameraComponent = cameraComponent; ShaderChunks.get(device, SHADERLANGUAGE_GLSL).set('cocPS', glslCocPS); ShaderChunks.get(device, SHADERLANGUAGE_WGSL).set('cocPS', wgslCocPS); const defines = new Map(); if (nearBlur) defines.set('NEAR_BLUR', ''); ShaderUtils.addScreenDepthChunkDefines(device, cameraComponent.shaderParams, defines); this.shader = ShaderUtils.createShader(device, { uniqueName: `CocShader-${nearBlur}`, attributes: { aPosition: SEMANTIC_POSITION }, vertexChunk: 'quadVS', fragmentChunk: 'cocPS', fragmentDefines: defines }); this.paramsId = device.scope.resolve('params'); this.paramsValue = new Float32Array(3); this.cameraParams = new Float32Array(4); this.cameraParamsId = device.scope.resolve('camera_params'); } } export { RenderPassCoC };