Для проецирования тени на плоскость есть простой способ (не очень эффективный, но простой).
Эта функция не моя, я забыл, где ее нашел. Он создает матричную проекцию, которая отображает все, что вы рисуете, в одну плоскость.
static inline void glShadowProjection(float * l, float * e, float * n)
{
float d, c;
float mat[16];
// These are c and d (corresponding to the tutorial)
d = n[0]*l[0] + n[1]*l[1] + n[2]*l[2];
c = e[0]*n[0] + e[1]*n[1] + e[2]*n[2] - d;
// Create the matrix. OpenGL uses column by column
// ordering
mat[0] = l[0]*n[0]+c;
mat[4] = n[1]*l[0];
mat[8] = n[2]*l[0];
mat[12] = -l[0]*c-l[0]*d;
mat[1] = n[0]*l[1];
mat[5] = l[1]*n[1]+c;
mat[9] = n[2]*l[1];
mat[13] = -l[1]*c-l[1]*d;
mat[2] = n[0]*l[2];
mat[6] = n[1]*l[2];
mat[10] = l[2]*n[2]+c;
mat[14] = -l[2]*c-l[2]*d;
mat[3] = n[0];
mat[7] = n[1];
mat[11] = n[2];
mat[15] = -d;
// Finally multiply the matrices together *plonk*
glMultMatrixf(mat);
}
Используйте это так:
Нарисуй свой объект.
glDrawArrays(GL_TRIANGLES, 0, machadoNumVerts); // Machado
Добавьте в него положение источника света, плоскость, в которой будет проецироваться тень, и нормаль.
float lightPosition[] = {383.0, 461.0, 500.0, 0.0}
float n[] = { 0.0, 0.0, -1.0 }; // Normal vector for the plane
float e[] = { 0.0, 0.0, beltOrigin+1 }; // Point of the plane
glShadowProjection(lightPosition,e,n);
Хорошо, применяется теневая матрица.
Измените цвет рисунка на подходящий.
glColor4f(0.3, 0.3, 0.3, 0.9);
Нарисуйте свой объект снова.
glDrawArrays(GL_TRIANGLES, 0, machadoNumVerts); // Machado
Вот почему это неэффективно: чем сложнее объект, тем больше бесполезных треугольников вы тратите только на тень.
Также помните, что все манипуляции, выполненные с незатененным объектом, должны выполняться после применения матрицы теней.
Для более сложных вещей предмет немного широк и зависит от вашей сцены и сложности.