I am following the [WebGL2Fundametals tutorial][1]. Using some sample (cube) data I was able to successfully call `gl.drawElements();` using index, normal and geometry data. This are my fragment and vertex shaders: Fragment shader: #version 300 es precision mediump float; in vec3 v_normal; in vec3 v_surfaceToLight; in vec3 v_surfaceToView; uniform vec4 u_color; uniform float u_shininess; uniform vec3 u_lightDirection; uniform float u_innerLimit; // In dot space uniform float u_outerLimit; // In dot space out vec4 outColor; void main() { vec3 normal = normalize(v_normal); vec3 surfaceToLightDirection = normalize(v_surfaceToLight); vec3 surfaceToViewDirection = normalize(v_surfaceToView); vec3 halfVector = normalize(surfaceToLightDirection + surfaceToViewDirection); float dotFromDirection = dot(surfaceToLightDirection, -u_lightDirection); float inLight = smoothstep(u_outerLimit, u_innerLimit, dotFromDirection); // Using normals for color calculation based on the incidence of light float light = inLight * dot(normal, surfaceToLightDirection); float specular = inLight * pow(dot(normal, halfVector), u_shininess); outColor = u_color; outColor.rgb *= light; // Add in the specular outColor.rgb += specular; } Vertex shader: #version 300 es in vec4 a_position; in vec3 a_normal; uniform mat4 u_world; uniform mat4 u_worldViewProjection; uniform mat4 u_worldInverseTranspose; uniform vec3 u_lightWorldPosition; uniform vec3 u_viewWorldPosition; // varying to pass the normal to the fragment shader out vec3 v_normal; out vec3 v_surfaceToLight; out vec3 v_surfaceToView; void main() { gl_Position = u_worldViewProjection * a_position; // Orient the normals and pass to the fragment shader v_normal = mat3(u_worldInverseTranspose) * a_normal; vec3 surfaceWorldPosition = (u_world * a_position).xyz; v_surfaceToLight = u_lightWorldPosition - surfaceWorldPosition; v_surfaceToView = u_viewWorldPosition - surfaceWorldPosition; } With the following call the cube is successfully rendered: gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); GLHelper.setUniformValues(this._uniforms, uniformValues); gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0); Here is the working cube data: Vertices: // Front face -100, -100, 100, 100, -100, 100, 100, 100, 100, -100, 100, 100, // Back face -100, -100, -100, -100, 100, -100, 100, 100, -100, 100, -100, -100, // Top face -100, 100, -100, -100, 100, 100, 100, 100, 100, 100, 100, -100, // Bottom face -100, -100, -100, 100, -100, -100, 100, -100, 100, -100, -100, 100, // Right face 100, -100, -100, 100, 100, -100, 100, 100, 100, 100, -100, 100, // Left face -100, -100, -100, -100, -100, 100, -100, 100, 100, -100, 100, -100, Normals: // Front 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Back face 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, // Top face 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Bottom face 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // Right face 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Left face -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, Indices: 0, 1, 2, 0, 2, 3, // Front face 4, 5, 6, 4, 6, 7, // Back face 8, 9, 10, 8, 10, 11, // Top face 12, 13, 14, 12, 14, 15, // Bottom face 16, 17, 18, 16, 18, 19, // Right face 20, 21, 22, 20, 22, 23, // Left face If I get it right the normals in this model should look something like the cube's normals in [the very first animation in the "Introducing normals" part](https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-directional.html). Now I was trying to create and import a cube using Blender. Unfortunately I wasn't able to recreate a cube with the same kind of normals. Blender generates only one (pink) normal per vertex and they also obviously have a totally different angle: [![enter image description here][2]][2] [Some sources](https://blender.stackexchange.com/a/14697) suggest that smoothing the faces would fix this issue. It did not for me. Here is the Wavefront file: o Cube v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 -1.000000 -1.000000 v 1.000000 1.000000 -0.999999 v 0.999999 1.000000 1.000001 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 vn 1.0000 -0.0000 0.0000 vn 0.0000 -0.0000 1.0000 vn -1.0000 -0.0000 -0.0000 vn 0.0000 0.0000 -1.0000 s off f 1//1 3//1 4//1 f 8//2 6//2 5//2 f 5//3 2//3 1//3 f 6//4 3//4 2//4 f 3//5 8//5 4//5 f 1//6 8//6 5//6 f 1//1 2//1 3//1 f 8//2 7//2 6//2 f 5//3 6//3 2//3 f 6//4 7//4 3//4 f 3//5 7//5 8//5 f 1//6 4//6 8//6 When I try to import and to render this data using `gl.drawElements(gl.TRIANGLES, 72, gl.UNSIGNED_SHORT, 0);` I get the following output: > ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of > range vertices in attribute 1 If I use above (.obj) vertex and normal data six time each I do not get any more errors but instead of a cube only a single triangle seems to be rendered. [![enter image description here][3]][3] I am pretty sure that `attribute 1` is `in vec3 a_normal;` in my vertex shader. So I am mainly confused about one thing here: - How do I modify my code in order to interpret and render the data correctly? **EDIT:** After changing indices to be zero based I do get more than a single triangle, the object still looks wrong. [![enter image description here][4]][4] The result drawn with `gl.LINES`: [![enter image description here][5]][5] [1]: https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-directional.html [2]: https://i.sstatic.net/JhiETm.png [3]: https://i.sstatic.net/JFspWm.png [4]: https://i.sstatic.net/VpR3l.gif [5]: https://i.sstatic.net/88klr.gif