Texture coordinates are exposed to the shader code in the same way that they are with any other vertex attribute. We'll want to include a two-element vector attribute in our vertex shader that will map to our texture coordinates:
in vec2 aVertexTextureCoords;
Additionally, we will also want to add a new uniform to the fragment shader that uses a type we haven't seen before: sampler2D. The sampler2D uniform is what allows us to access the texture data in the shader:
uniform sampler2D uSampler;
In the past, when we've used uniforms, we set them to the value that we want them to be in the shader, such as a light color. Samplers work a bit differently. The following code shows how to associate a texture with a specific sampler uniform:
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.uniform1i(program.uSampler, 0...