OpenGL-ES 1.x добавить тень? - PullRequest
       1

OpenGL-ES 1.x добавить тень?

1 голос
/ 29 декабря 2011

Есть ли простой способ добавить тени в opengl-es 1.x?Или только в 2.0?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Для проецирования тени на плоскость есть простой способ (не очень эффективный, но простой).

Эта функция не моя, я забыл, где ее нашел. Он создает матричную проекцию, которая отображает все, что вы рисуете, в одну плоскость.

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

Вот почему это неэффективно: чем сложнее объект, тем больше бесполезных треугольников вы тратите только на тень.

Также помните, что все манипуляции, выполненные с незатененным объектом, должны выполняться после применения матрицы теней.

Для более сложных вещей предмет немного широк и зависит от вашей сцены и сложности.

0 голосов
/ 29 декабря 2011

Возможны проекционные текстуры с тенями, как они были сделаны с OpenGL-1.2 без шейдеров. Ищите старые уроки по теневому картографированию, написанные в период с 1999 по 2002 год.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...