UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

50 lines (47 loc) 2.13 kB
import { SHADERLANGUAGE_GLSL, SHADERLANGUAGE_WGSL, SEMANTIC_POSITION } from '../../platform/graphics/constants.js'; import { PROJECTION_ORTHOGRAPHIC } from '../../scene/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 { 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'); } 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; const f = camera._farClip; this.cameraParams[0] = 1 / f; this.cameraParams[1] = f; this.cameraParams[2] = camera._nearClip; this.cameraParams[3] = camera.projection === PROJECTION_ORTHOGRAPHIC ? 1 : 0; this.cameraParamsId.setValue(this.cameraParams); super.execute(); } } export { RenderPassCoC };