- Une liste de sommets
- Une liste d'attributs (couleurs, normales...)
- Des relations d'adjacence
- + autres... (caméras, lumières, textures...)
Une grille 2D de pixels
Le principe est de créer un materiau et d'ecrire les programmes correspondant pour changer l'execution du pipeline
Un style de materiau : MeshShaderMaterial
var shaderMaterial = new THREE.MeshShaderMaterial({
uniforms: uniforms,
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
En WebGL, il est obligatoire de définir un vertex et un fragment program (Three.js le fait pour les matériaux utilisés jusqu'à présent)
Que faire avec ces shaders ?
Si on ne fait pas la projection, on ne voit pas grand chose
Commençons par simuler le pipeline fixe : le matériau MeshBasicMaterial
void main() {
gl_Position = projectionMatrix *
modelViewMatrix *
vec4(position,1.0);
}
void main() {
// d?finir la couleur sous la forme RGBA (0.0 - 1.0)
gl_FragColor = vec4(0.0,0.5,0.5,1.0);
}
var myUniforms =
{
color :
{
type :'c', // une couleur
value : new THREE.Color( 0xffffff )
},
}
var material = new THREE.ShaderMaterial( {
uniforms : myUniforms,
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
} );
myUniforms.color.value = new THREE.Color(value);
uniform float multiplicateur; // entre -1 et 1
void main() {
vec3 myPosition = position + normal*multiplicateur;
gl_Position = projectionMatrix *
modelViewMatrix *
vec4(myPosition,1.0);
}
void main() {
gl_FragColor = vec4(gl_FragCoord.xy*0.001,0.5,1.0);
}