Shaders
import testVertexShader from './shaders/test/vertex.glsl'
import testFragmentShader from './shaders/test/fragment.glsl'
const geometry = new THREE.PlaneBufferGeometry(1, 1, 32, 32)
const material = new THREE.RawShaderMaterial({
vertexShader: testVertexShader,
fragmentShader: testFragmentShader,
})
const mesh = new THREE.Mesh(geometry, material)
src/shaders/test/vertex.glsl
attribute vec3 position;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
void main() {
gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0);
}
src/shaders/test/fragment.glsl
precision mediump float;
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
Add attribute to geometry
script.js
const geometry = new THREE.PlaneBufferGeometry(1, 1, 32, 32)
const count = geometry.attributes.position.count
const randoms = new Floar32Array(count)
// 1 .. how many values to consume per vertex
geometry.setAttribute('my_attribute', new THREE.BufferAttribute(randoms, 1))
vertex.glsl
attribute float my_attribute;
void main() {
}
Send data from vertex to fragment shader
vertex.glsl
varying float out_my_attribute;
void main() {
out_my_attribute = my_attribute;
}
fragment.glsl
varying float out_my_attribute;
void main() {
out_my_attribute = my_attribute;
}
Uniforms
const material = new THREE.RawShaderMaterial({
/* .. */
uniforms: {
myFloat: { value: 10 }
myVector2: { value: new THREE.Vector2(1, 2) }
uTime: { value: 0 }
uColor: { value: new THREE.Color('orange') }
}
})
const clock = new THREE.Clock()
const tick = () => {
const elapsedTime = clock.getElapsedTime()
material.uniforms.uTime.value = elapsedTime
}
Loading Textures
script.js
const textureLoader = new THREE.TextureLoader()
// That's inside the static folder
const flagTexture = textureLoader.load('/textures/flag.png')
const material = new THREE.RawShaderMaterial({
/* .. */
uniforms:
{
uTexture: { value: flagTexture }
}
})
vertex.glsl
attribute vec2 uv;
varying vec2 vUv;
void main() {
vUv = uv;
}
fragment.glsl
uniform sampler2D uTexture;
varying vec2 vUv;
void main() {
vec4 textureColor = texture2D(uTexture, vUv);
gl_FragColor = textureColor;
}