Skip to main content

Loading textures

Before we started

Creating fragment and vertex shader

const vert = `
attribute vec3 position;
attribute vec2 texCoord;
varying vec2 vTexCoord;
void main() {
vTexCoord = texCoord;
gl.Position = vec4(position, 1);
gl.PointSize = 10.0;
}
`

const frag = `
uniform sampler2D textureUnit;
varying vec2 vTexCoord;
uniform vec4 color;
void main() {
gl.FragColor = texture2D(textureUnit, vTexCoord);
gl.FragColor += color;
}
`

Set uniform and attribute

const textureUnit = 'https://i.imgur.com/XXXXX.png'
const color = [21, 21, 21, 1]
const position = [-1, 1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];
const texCoord = [0, 0, 1, 0, 0, 1, 1, 1];
const indices = [0, 1, 2, 2, 1, 3];

const App = (props) => {
const gl = useGL({ frag, vert })
gl.setTexture({ textureUnit })
gl.setUniform({ color })
gl.setAttribute({ position, texCoord }, indices)

Rendering the scene

gl.setFrame(() => {
gl.clear() // to run gl.clear(gl.COLOR_BUFFER_BIT)
gl.viewport() // to run gl.viewport(0, 0, width, height)
gl.drawArrays() // to run gl.drawArrays(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)
return true // to continue rendering
})

The result

import { createRoot } from 'react-dom/client'
import { useGL } from 'glre/react'

const vert = `
attribute vec3 position;
attribute vec2 texCoord;
varying vec2 vTexCoord;
void main() {
vTexCoord = texCoord;
gl.Position = vec4(position, 1);
gl.PointSize = 10.0;
}
`

const frag = `
uniform sampler2D textureUnit;
varying vec2 vTexCoord;
void main() {
gl.FragColor = texture2D(textureUnit, vTexCoord);
}
`

const textureUnit = '...png'
const position = [-1, 1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]
const texCoord = [0, 0, 1, 0, 0, 1, 1, 1]
const indices = [0, 1, 2, 2, 1, 3]

const App = (props) => {
const gl = useGL({ frag, vert })
gl.setTexture({ textureUnit })
gl.setAttribute({ position, texCoord }, indices)
gl.setFrame(() => {
gl.clear() // to run gl.clear(gl.COLOR_BUFFER_BIT)
gl.viewport() // to run gl.viewport(0, 0, width, height)
gl.drawArrays() // to run gl.drawArrays(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)
return true // to continue rendering
})
return <canvas id={gl.id} {...props} />
}

const style = { top: 0, left: 0, position: 'fixed', background: '#212121' }

createRoot(document.getElementById('root')).render(<App style={style} />)