{{notification.text}}

MirGames

06.08.09 01:04
0
Вроде бы почитал статьи по теме, поразбирал примеры NeHe и не только и попробовал реализовать... Но всё-таки что-то невкурил :blush:
Да, нормали высчитаны, модельки освещаются... Но освещаются бредовато. Т.е. когда я вращаю модельку - вращается и источник света по отношению к ней.
Причем это происходит независимо от того, устанавливаю я камеру до gluLookAt или после (но выглядит несколько по-разному).
Да, вот пример. Вращаю только модель - освещение двигаться как бы не должно...
Изображение Изображение Изображение
Делаю вот так:
Код
GLfloat LightAmbient[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Значения фонового света
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Значения диффузного света
GLfloat LightPosition[]= { 18.0f, 6.0f, 24.0f, 1.0f };     // Позиция света

void LIG(){
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);    // Установка Фонового Света
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);    // Установка Диффузного Света

  glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0);   //дальность освещениея
  glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);

glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);   // Позиция света

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1); // Разрешение источника света номер один
//glEnable(GL_COLOR_MATERIAL);
}

Рисую:

Код
// LIG(); //а можно и тут, будет косячить по-иному
SetCamera(xs*place/2+1.5,   2+addy,   xs*place/2+addx-1.5,
                 xs*place/2+1.5,   2-addy,   xs*place/2-addx-1.5);
LIG();
CalculateFrustum();
for (int x=0;x<xs;x++)
for (int y=0;y<xs;y++)
if (SphereInFrustum(x*place,0,y*place,0.2))
{
wolfa.AngleZ=Angle2;
ppsh.AngleZ=Angle2;
wolfa.Move(x*place,0,y*place);
ppsh.Move(x*place,0,y*place);

    wolfa.DrawStatic();
   ppsh.DrawStatic();
};
glDisable(GL_LIGHTING);


Рисование модельки:
Код
void TModel::DrawStatic(){
glPushMatrix();                  
int ch3=sizeof(Vec3)*V_Count*K_Count+sizeof(Vec2)*V_Count;
SetPos3D(X,Y,Z);
RotateX(AngleX);
RotateY(AngleY);
RotateZ(AngleZ);
Size3D(Size);
if (K_Count>1)                              
while (Frame>=K_Count-1) Frame-=K_Count-1;


  glBindTexture(GL_TEXTURE_2D,TextureID);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,Vertex2);
int ch=(int(Frame)*sizeof(Vec3)+sizeof(Vec2))*V_Count;
        glVertexPointer(3,GL_FLOAT,sizeof(Vec3),(void*)ch);
                glTexCoordPointer(2, GL_FLOAT, sizeof(Vec2),NULL);
glEnableClientState(GL_NORMAL_ARRAY);
              glNormalPointer(GL_FLOAT, sizeof(Vec3),(void*)ch3);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,Face2);
        glDrawElements(GL_TRIANGLES,F_Count*3,GL_UNSIGNED_SHORT, NULL);


glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
glPopMatrix();        
};


Сразу уточню, даже если освещать без текстур или с текстурами и с glEnable(GL_COLOR_MATERIAL) проблема остаётся. Т.е. освещение есть, но оно движется с каждой моделькой персонально... o_O

#1
mov, просто mov
06.08.09 01:57
0
Цитата
GLfloat LightPosition[]= { 18.0f, 6.0f, 24.0f, 1.0f }; // Позиция света

возможно вместо 1 - 0?
#2
аксакал
06.08.09 02:04
0
Если FFP, то насколько я помню там позицию источника надо выставлять после каждого изменения матрицы вида.
#3
06.08.09 02:24
0
В смысле, если у меня источник висит на одном месте - мне нужно для каждой модельки после каждого поворота его позицию перебивать? O_O Чет пока не особо получается....
И что есть FFP ?
MegaI2
Пробовал, с 1 похоже на правду значительно больше. Да и судя по документации должно быть 1...
Отредактировано: 06.08.09 02:29
#4
mov, просто mov
06.08.09 02:26
0
Цитата(Nubilius @ 5.08.2009 - 22:24) [snapback]97213[/snapback]

И что есть FFP ?

Fixed function pipeline
#5
06.08.09 02:46
0
Ясенько. А в случае с шейдерным вариантом значит достаточно один раз указать освещение для сцены, а досчитывать в шейдере?
Но пока всё-таки хочется понять с классическим вариантом что не так...
Отредактировано: 06.08.09 02:46
#6
06.08.09 03:58
0
Nubilius ну вопервых почему ты юзаешь ligh1 а не light0....вторых ты уж выбери ATTENUATION))))констант или ллинейную
а вообще странно...мне кажется дело в нормалях...))
#7
аксакал
06.08.09 04:27
0
Nubilius
Если шейдер, то должен поворачивать либо нормали модели, либо вектор на источник матрицей модели (не путать с ModelView)
#8
06.08.09 04:29
0
lans
Ну как бы ничего не изменилось, и если поисправлять указанные тобою вещи.. Да и не должны были поидее.

Сча попробую переделать расчет нормалей.
#9
06.08.09 06:11
0
Вопрос такой назрел. А то чет мозг уже начинает скипать.
А в VBO когда подаёшь набор нормалей - подразумевается нормали к полигонам или к вершинам?
(как меня не поражает само это понятие, тем не менее, скажем в DGLE 1.1 сначала считаются нормали к полигонам, а уже потом к вершинам).

P.S. как не рассчитывал, гадость с освещением остаётся.
#10
06.08.09 06:57
0
Цитата(Nubilius @ Сегодня, 04:11)
[snapback]97221[/snapback]
А в VBO когда подаёшь набор нормалей - подразумевается нормали к полигонам или к вершинам?

Для OpenGL существуют только нормали к вершинам. Они нужны для расчета освещения.
Цитата(Nubilius @ Сегодня, 04:11)
[snapback]97221[/snapback]
(как меня не поражает само это понятие, тем не менее, скажем в DGLE 1.1 сначала считаются нормали к полигонам, а уже потом к вершинам).

Разумеется. А как ты предлагаешь посчитать нормаль к вершине? Ее можно только для окружающих полигонов посчитать, а потом пересчитать в нормаль вершины, руководствуясь нужным результатом (например, чтобы углы сглаживались, или наоборот - выделялись).
Вообще, нормаль нужна потому, что от нее зависит освещение, а по 1 точке, доступной вершинному процессору (а в FFP освещение считается именно там) ее вычислить нельзя. Поэтому приходится нормаль считать снаружи для полигона, которому принадлежит вершина и передавать вместе с вершиной. Но если вершина принадлежит нескольким полигонам, не лежащим в одной плоскости - тогда и возникает вопрос, кок собрать нормали ко всем этим полигонам в одну для передачи вместе с вершиной. Обычно их интерполируют для получения гладкого освещения.
#11
06.08.09 18:08
0
Вот тепеь дошло. До меня просто и не доходило, что это за зверь - нормаль к вершине (нормаль к точке).
А терь вродь даже получилось верно.
Правда, честный способ интерполирования пока не выходит на одной из моделей (почему то вылетает прога при попытке поюзать метод из DGLE), а упрощенные вполне себе даёт логичный результат. Терь буду добивать честный метод и шейдер.

В общем, верный порядок - ставим камеру. ставим освещение, рисуем всё и вся. Почему с первого раза не вышло - не понимаю...

Всем спасибо :)
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}