без GL
https://www.khronos.org/webgl/wiki/WebGL_and_OpenGL_Differencesgl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(this.gl.TEXTURE_2D, ..., image)
gl.uniform1i(gl.getUniformLocation('u_image'), 0);
const texture = gl.createTexture()
const canvas = document.createElement('canvas')
gl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(gl.TEXTURE_2D, ..., canvas)
const texture = gl.createTexture()
const canvas = document.createElement('canvas')
gl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(gl.TEXTURE_2D, ..., canvas)
const texture = gl.createTexture()
const canvas = document.createElement('canvas')
gl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(gl.TEXTURE_2D, ..., canvas)
uniform sampler2D u_background;
varying vec2 v_texCoord;
void main() {
gl_FragColor = texture2D(u_background, v_texCoord);
}
const texture = gl.createTexture()
const canvas = document.createElement('canvas')
gl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(gl.TEXTURE_2D, ..., canvas)
// получаем ссылки на сэмплеры
var u_image0 = gl.getUniformLocation(program, "u_image0")
var u_image1 = gl.getUniformLocation(program, "u_image1")
// задаём, какой текстурный блок использовать при рендеринге
gl.uniform1i(u_image0, 0)
gl.uniform1i(u_image1, 1)
// привязываем текстуру к текстурному блоку
gl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, textures[0])
gl.activeTexture(gl.TEXTURE1)
gl.bindTexture(gl.TEXTURE_2D, textures[1])
const textures = []
function addTexture(canvas, name) {
const texture = gl.createTexture()
const location = gl.getUniformLocation(program, name)
textures.push({texture, canvas, location})
}
textures.forEach(({texture, canvas, location}, i) => {
gl.activeTexture(gl[`TEXTURE${i}`])
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(this.gl.TEXTURE_2D, ..., canvas)
gl.uniform1i(location, i);
})
textures.forEach(({texture, canvas, location}, i) => {
gl.activeTexture(gl[`TEXTURE${i}`])
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(this.gl.TEXTURE_2D, ..., canvas)
gl.uniform1i(location, i);
})
textures.forEach(({texture, canvas, location}, i) => {
gl.activeTexture(gl[`TEXTURE${i}`])
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.texImage2D(this.gl.TEXTURE_2D, ..., canvas)
gl.uniform1i(location, i);
})
uniform sampler2D u_background;
uniform sampler2D u_foreground;
varying vec2 v_texCoord;
void main() {
gl_FragColor = texture2D(u_background, v_texCoord)
+ texture2D(u_foreground, v_texCoord);
}
rules: [
...
{
test: /\.frag?$/,
use: 'raw-loader',
}]
import * as fragmentShader from './shader.frag'
import * as vertexShader from './shader.vert'
const shaders = [vertexShader, fragmentShader]
const program = createProgramFromSources(gl, shaders)
<Container>
{state.enemies.map(enemy => (<Enemy {...enemy}/>))}
{state.explosions.map(enemy => (<Explosion {...enemy}/>))}
<Actor {...state.hero}/>
<Header x={0} y={0} text={state.kills}/>
<Container>