Witam,
Tak się zastanawiam ostatnio, jak to jest z tymi światłami w opengl, tworze sobie sześcian z środkiem w 0.0 i boku długości 1.0. Następnie obracam go o kąt alfa i przemieszczam na pozycję (-0.8, 0.0, -3.0) i próbuje umieścić światło tak jak by się znajdowało po prawej stronie sześcianu (pozycja 0.0, 0.0, -3.0). Kiedy próbuje ten efekt uzyskać ręcznie:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat position[] = { 0.0f, 0.0f, -3.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, position);
Matrix3d m1, m2, m3;
Matrix3d::transformMatrix3d(-0.8f, 0.0f, -3.0f, m1);
Matrix3d::rotateMatrix3dY(a, m2);
Matrix3d::mul(m2, m1, m3); // m3 = m2 * m1
glBegin(GL_QUADS);
Face3d*& face = mesh1->face;
for(unsigned int i=0; i<mesh1->count; i++) {
Vertex3d*& vertex = face[i].vertex;
for(unsigned int j=0; j<face[i].count; j++) {
Vector3d& vect = vertex[j].vect;
Vector3d tmp;
m3->mul(vect, tmp); // tmp = vect * m3
glColor3f(vertex[j].r, vertex[j].g, vertex[j].b);
glVertex3f(tmp.x, tmp.y, tmp.z);
}
}
glEnd();
Wszystko działa, sam tworze macierz i wrzucam już przemnożone przez macierz wierzchołki.
Kiedy próbuje zmusić do tego samego opengl czyli dodaje linijkę glLoadMatrixf(m3->data); przed glBegin(GL_QUADS) i zamieniam glVertex3f(tmp.x, tmp.y, tmp.z); na glVertex3f(vect.x, vect.y, vect.z); światło nie zachowuje se w taki sam sposób. Wygląda to bardziej tak jak by najpierw było obliczane oświetlenie a dop potem wierzchołki były mnożone przez macierz =/
Próbowałem też glLightfv(GL_LIGHT0, GL_POSITION, position); umieścić w push/pop matrix i wewnątrz zrobić odwrotne przekształcenie tak żeby światło było przemieszczone do pozycji modelu znajdującego się w 0,0,0 ale niestety mi to nie wyszło. Da się to jakoś naprawić? czy zmuszony jestem przetwarzać wierzchołki przez CPU zamiast GPU?