shaders = {
const vs = `#version 300 es
in vec3 position; // Attribute
in vec3 normal; // Attribute
uniform mat4 shiftMatrix;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projMatrix;
uniform float aspect;
out vec3 fragPosition;
out vec3 fragNormal;
uniform vec3 offsets[3];
void main(){
vec4 newPos = modelMatrix*shiftMatrix*vec4(position,1);
fragPosition = newPos.xyz;
gl_Position = projMatrix*viewMatrix*newPos;
mat4 normalMatrix = transpose(inverse(modelMatrix));
fragNormal = (normalMatrix * vec4(normal, 0.0) ).xyz;
}`;
const fs = `#version 300 es
precision mediump float;
out vec4 outColor;
in vec3 fragPosition;
in vec3 fragNormal;
uniform int instanceID;
uniform vec4 lightPosOrDir;
uniform vec3 eyePosition;
uniform vec3 materialColor;
uniform float ambientIntensity;
uniform vec3 specularColor;
uniform float shininess;
uniform float K_s;
void main(){
vec3 N = normalize(fragNormal);
vec3 L;
if (lightPosOrDir.w==0.0){
L = normalize(lightPosOrDir.xyz);
}
else{
L = normalize(lightPosOrDir.xyz-fragPosition);
}
vec3 V = normalize(eyePosition-fragPosition);
vec3 H = normalize(L+V);
vec3 ambient = ambientIntensity*materialColor;
vec3 diffuse = materialColor * clamp(dot(L,N), 0.0, 1.0);
vec3 specular = specularColor * pow(clamp(dot(H,N),0.0, 1.0), shininess);
vec3 color = (1.-K_s)*diffuse + K_s*specular + ambient;
outColor = vec4(color, 1);
if (instanceID == 0)
{
//outColor = vec4(L, 1.0);
outColor = vec4(diffuse, 1.0);
}
else if (instanceID == 1)
{
outColor = vec4(specular, 1.0);
}
else if (instanceID == 2)
{
outColor = vec4(color, 1.0);
}
else
{
vec3 N = abs(normalize(fragNormal));
outColor = vec4(N, 1.0);
}
}`;
return [vs, fs];
}