-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
skybox.js
51 lines (45 loc) · 2.42 KB
/
skybox.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { SEMANTIC_POSITION } from '../../../platform/graphics/constants.js';
import { shaderChunks } from '../chunks/chunks.js';
import { ChunkUtils } from '../chunk-utils.js';
import { ShaderUtils } from '../../../platform/graphics/shader-utils.js';
import { ShaderGenerator } from './shader-generator.js';
class ShaderGeneratorSkybox extends ShaderGenerator {
generateKey(options) {
return options.type === 'cubemap' ?
`skybox-${options.type}-${options.encoding}-${options.useIntensity}-${options.gamma}-${options.toneMapping}-${options.fixSeams}-${options.mip}-${options.projectionEnabled}` :
`skybox-${options.type}-${options.encoding}-${options.useIntensity}-${options.gamma}-${options.toneMapping}`;
}
createShaderDefinition(device, options) {
let fshader = '';
if (options.type === 'cubemap') {
const mip2size = [128, 64, /* 32 */ 16, 8, 4, 2];
fshader += options.projectionEnabled ? '#define PROJECTED_SKYDOME\n' : '';
fshader += options.mip ? shaderChunks.fixCubemapSeamsStretchPS : shaderChunks.fixCubemapSeamsNonePS;
fshader += options.useIntensity ? shaderChunks.envMultiplyPS : shaderChunks.envConstPS;
fshader += shaderChunks.decodePS;
fshader += ShaderGenerator.gammaCode(options.gamma);
fshader += ShaderGenerator.tonemapCode(options.toneMapping);
fshader += shaderChunks.skyboxHDRPS
.replace(/\$DECODE/g, ChunkUtils.decodeFunc(options.encoding))
.replace(/\$FIXCONST/g, (1 - 1 / mip2size[options.mip]) + "");
} else {
fshader += options.useIntensity ? shaderChunks.envMultiplyPS : shaderChunks.envConstPS;
fshader += shaderChunks.decodePS;
fshader += ShaderGenerator.gammaCode(options.gamma);
fshader += ShaderGenerator.tonemapCode(options.toneMapping);
fshader += shaderChunks.sphericalPS;
fshader += shaderChunks.envAtlasPS;
fshader += shaderChunks.skyboxEnvPS.replace(/\$DECODE/g, ChunkUtils.decodeFunc(options.encoding));
}
return ShaderUtils.createDefinition(device, {
name: 'SkyboxShader',
attributes: {
aPosition: SEMANTIC_POSITION
},
vertexCode: shaderChunks.skyboxVS,
fragmentCode: fshader
});
}
}
const skybox = new ShaderGeneratorSkybox();
export { skybox };