glColorPointer ( 4, GL_FLOAT, 0, colorArray );
glEnableClientState ( GL_COLOR_ARRAY );
}

Добавляем Модели

else
glDisableClientState ( GL„COLOR_ARRAY );
if ( normals != NULL ) {
glNormalPointer ( GL_FLOAT, 0, normals );
glEnableClientState ( GL_NORMAL_ARRAY );
}
else
glDisableClientState ( GL._NORMAL_ARRAY );
if ( texCoords != NULL ) {
glTexCoordPointer ( 2 ,GL_FLOAT, 0, texCoords ); glEnableClientState ( GL_TEXTURE_COORD_ARRAY );
}
else
glDisableClientState ( GL_TEXTURE_COORD_ARRAY );
glDrawElements ( GL_TRIANGLES, 3*numFaces, GL_UNSIGNED_INT, faces );
glDisableClientState ( GL_VERTEX_ARRAY );
glDisableClientState ( GL_COLOR_ARRAY );
glDisableClientState ( GL_NORMAL_ARRAY );
glDisableClientState ( GL_TEXTURE_COORD_ARRAY );
glShadeModel ( shadeModel );
}

Если мы хотим добавить поддержку тумана, т. е. ситуации, когда объект находится в тумане, может быть даже частично, то необходимо вычислить значение цвета в вершинах с учетом затуманивания. Для этого удобно опять использовать массив tempColors. Реализация приводится ниже.

if ( fog != NULL ) // compute fogging fore vertices,
// using tempColors array
{
for ( int i = 0;i < numVertices; i++ )
tempColors [i] = fog -> getBlendColor ( camera.getPos (), vertices [i], NULL );
cachedColor = Vector4D ( -1, -1, -1, -1 ) ; colorArray = tempColors;
}

Наконец, еще одной возможностью, которую хотелось бы добавить, является поддержка полупрозрачных объектов. Для правильной отрисовки таких объектов их грани должны выводиться в порядке приближения к наблюдателю (back-to-front). Для этого удобно отсортировать грани по расстоянию от середины грани до наблюдателя (камеры) вдоль направления вектора взгляда.

Для реализации этого удобно ввести еще один вспомогательный массив, где для каждой грани будет храниться ее номер и. значение ключа сортировки. Перед выводом модели массив заполняется значениями ключей сортировки и сортируется функцией qsort. После этого грани выводятся в порядке их следования в уже отсортированном массиве.


⇐ Предыдущая| |Следующая ⇒