-
-
Notifications
You must be signed in to change notification settings - Fork 4.8k
/
generateMultiTextureShader.js
69 lines (53 loc) · 1.47 KB
/
generateMultiTextureShader.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { Shader, UniformGroup } from '@pixi/core';
import vertex from './texture.vert';
const fragTemplate = [
'varying vec2 vTextureCoord;',
'varying vec4 vColor;',
'varying float vTextureId;',
'uniform sampler2D uSamplers[%count%];',
'void main(void){',
'vec4 color;',
'float textureId = floor(vTextureId+0.5);',
'%forloop%',
'gl_FragColor = color * vColor;',
'}',
].join('\n');
export default function generateMultiTextureShader(gl, maxTextures)
{
const sampleValues = new Int32Array(maxTextures);
for (let i = 0; i < maxTextures; i++)
{
sampleValues[i] = i;
}
const uniforms = {
default: UniformGroup.from({ uSamplers: sampleValues }, true),
};
let fragmentSrc = fragTemplate;
fragmentSrc = fragmentSrc.replace(/%count%/gi, maxTextures);
fragmentSrc = fragmentSrc.replace(/%forloop%/gi, generateSampleSrc(maxTextures));
const shader = Shader.from(vertex, fragmentSrc, uniforms);
return shader;
}
function generateSampleSrc(maxTextures)
{
let src = '';
src += '\n';
src += '\n';
for (let i = 0; i < maxTextures; i++)
{
if (i > 0)
{
src += '\nelse ';
}
if (i < maxTextures - 1)
{
src += `if(textureId == ${i}.0)`;
}
src += '\n{';
src += `\n\tcolor = texture2D(uSamplers[${i}], vTextureCoord);`;
src += '\n}';
}
src += '\n';
src += '\n';
return src;
}