Hello,
I’m programming a small game with BulletPhysics and OpenGL (2.1).
Yesterday I added lighting to the game, so I needed normals for the objects, too.
But I’ve got a problem with that:
I’m creating a cuboid with the following code:
m_vVertices.pObj = new CVector3D[8];
GLfloat corners[] = {-vHalfExtents.x, vHalfExtents.y, vHalfExtents.z,
vHalfExtents.x, vHalfExtents.y, vHalfExtents.z,
vHalfExtents.x, -vHalfExtents.y, vHalfExtents.z,
-vHalfExtents.x, -vHalfExtents.y, vHalfExtents.z,
-vHalfExtents.x, vHalfExtents.y, -vHalfExtents.z,
vHalfExtents.x, vHalfExtents.y, -vHalfExtents.z,
vHalfExtents.x, -vHalfExtents.y, -vHalfExtents.z,
-vHalfExtents.x, -vHalfExtents.y, -vHalfExtents.z};
for (int i = 0; i < 8; ++i)
{
m_vVertices.pObj[i].x = corners[i*3];
m_vVertices.pObj[i].y = corners[i*3+1];
m_vVertices.pObj[i].z = corners[i*3+2];
}
m_VertexIndices.pObj = new GLuint[6*4];
GLubyte indices[] = {0, 1, 2, 3,
4, 5, 1, 0,
3, 2, 6, 7,
5, 4, 7, 6,
1, 5, 6, 2,
4, 0, 3, 7};
for (int i = 0; i < 24; ++i)
{
m_VertexIndices.pObj[i] = indices[i];
}
Later, I’m rendering with this code:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, static_cast<void*>(m_vVertices.pObj));
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT,
static_cast<void*>(m_VertexIndices.pObj));
glDisableClientState(GL_VERTEX_ARRAY);
But when I wanted to add normals, I had a problem: As far as I know OpenGL doesn’t support surface normals, only vertex normals.
But because I’m reusing shared vertices with the help of an index array, I can’t specify normals per vertex beacause - dependent on which face a vertex belongs to - each vertex can have different normals. Is there a way I can still use indices to specify the order of the vertices drawn or do I have to declare shared vertices multiple times (for every face needed)?
Thank you for your answers in advance!