一度に2つの頂点配列をバインドすることはできません(glBindVertexArrayOES)。1つだけ作成してから、すべてのデータをそこに入れる必要があります。このアプローチを試してください:
glGenVertexArraysOES(1, &_vertexArray); //create vertex array
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(norms), NULL, GL_STATIC_DRAW); //create vertex buffer big enough for both verts and norms and pass NULL as data..
uint8_t *ptr = (uint8_t *)glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); //map buffer to pass data to it
memcpy(ptr, verts, sizeof(verts)); //copy verts
memcpy(ptr+sizeof(verts), norms, sizeof(norms)); //copy norms to position after verts
glUnmapBufferOES(GL_ARRAY_BUFFER);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); //tell GL where verts are in buffer
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(verts))); //tell GL where norms are in buffer
glBindVertexArrayOES(0);
法線のチェックまたは計算について:
クロス積を使用して、法線を計算し、鋭いエッジ(ヒッチがあなたの場合)をチェックできます。位置A、B、Cで定義された三角形ごとに:
s1 = B-A //s1 and s2 are just for easier reading
s2 = C-A
N = s1 x s2 //N is normal (not quite ready)
(cross product:)
N.x = s1.y*s2.z - s2.y*s1.z
N.y = s1.z*s2.x - s2.z*s1.x
N.z = s1.x*s2.y - s2.x*s1.y
ABCは任意の方向に向けることができるので、反対方向に法線を回す必要があるかもしれません。ドット積を使用してこの情報を取得できます。あなたの場合、形状の中心に近く、上にない点を取ります。それを定義する三角形のいずれか(ベクトルCenter(0,0,0)で十分かもしれません)。ここで、A、B、C、Nごとに:
vector Average = (A+B+C)/3 //center of a triangle
if(dotProduct(N, Center-Average) > 0) N = N * -1
(dotProduct:)
dot(M,N) = M.x*N.x + M.y*N.y + M.z*N.z
その後、各法線を正規化する必要があります(各コンポーネントを法線の長さで除算すると、各法線の長さは1になります)または、正規化フラグを次のように設定できます:glVertexAttribPointer(GLKVertexAttribNormal、3、GL_FLOAT、GL_TRUE .. ..