Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Освещение в OpenGl


Автор: Sheff 27.7.2002, 00:20
У меня проблема с освещением в OpenGl, короче так, я задаю источник света:
Код
glLightfv(GL_LIGHT0,GL_POSITION,позиция);

Потом рисую сферу с помощью gluSphere и плоскость с помощью glBegin(GL_QUADS). Притом сфера освещается нормально, т.е часть её может быть в тени, а чать освещена, всё так как я хотел, но вот с плоскостью проблемы, она всегда либо вся светлая, либо вся в тени. Как сделать так чтобы источник света освещал плоскость так же правильно как и сферу ?

Автор: Mikel 28.7.2002, 20:45
А в OpenGL такого нету. :(
Попробуй библиотеку glScene(может есть для C++)

Автор: Sheff 28.7.2002, 21:39
Есть, просто надо сначала рисовать объект, а потом свет :D

Автор: Mikel 29.7.2002, 18:41
У меня даже в книге написано, что нету :( . А где есть? :omg

Автор: Sheff 29.7.2002, 23:07
Цитата(Mikel @ 29.7.2002, 19:41)
У меня даже в книге написано, что нету :( . А где есть? :omg

Это есть в стандартном OpenGL, просто сначала надо рисовать объекты,а потом свет с помощью glLight и всё получается :)
А можно ещё разбить плоскость на треугольники, тогда освещение просто абалденное :))) И не нужно никаких дополнений.

Автор: Mikel 30.7.2002, 07:37
OK, попробую. :hehe

Автор: Art926 23.2.2004, 17:44
Да всё гораздо проще!
Просто алгоритм освещения в OpenGL расчитывает освещенность ТОЛЬКО В ВЕРШИНАХ многоугольниуков, притом не через сам угол (между нормалью и лучом), а через скалярное произведение векторов (Cos). Поэтому если ты нарисуешь достаточно большой многоугольник и слишком близко к его середине расположишь свет, то он вообще будет черным! (ведь каждая из вершин будет очень далеко от источника)
Способы решения проблемы:
1) Дробить многоугольник - самый немудренный.
2) Вывести и реализовать свой алгоритм освещения (тяжко, но развивает! как у тебя с аналитической геометрией?)
3) Воспользоваться Direct3D - по моему в нем есть альтернативы.

Автор: kuzia 23.2.2004, 18:34
треогональный способ освещения!

Автор: Sat 15.5.2004, 21:23
Помогите, люди добрые!

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat coords[]={0,0,0,1};
GLfloat sun[]={1,1,0.8f,1};
GLfloat dark[]={0,0,0,1};
glLightfv(GL_LIGHT0,GL_POSITION,coords);
glLightfv(GL_LIGHT0,GL_DIFFUSE,sun);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,dark);
...
gluLookAt(50,5,5,50,0,0,0,1,0);
glTranslatef(50,0,0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2,GL_DOUBLE,0,geoSphere[2]->texcoords);
glNormalPointer(GL_DOUBLE,0,geoSphere[2]->normals);
glVertexPointer(3,GL_DOUBLE,0,geoSphere[2]->verts);
glDrawArrays(GL_TRIANGLES,0,geoSphere[2]->numtris*3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

Глюк: Куда бы я ни поместил сферу (здесь 50,0,0) видимое 0.5сферие освещается так, будто источник света находится в точке обзора (50,5,5) задаваемой в gluLookAt. При этом если поменять источник света и сферу (сферу - в 0, а свет - в любое другое место), то сфера освещается корректно.

SOS me somebody! А то я уже офигел, пытаясь разобраться в чем тут дело!..

Автор: gepard 16.5.2004, 05:42
С освещением всё много проще!
Идёте на www.gametutorials.com, там ищите пример работы с multitexturing'ом.
И видите, что на один из полигонов накладывается текстура стены и маска освещения. Таким образом создаётся освещение. Эта методика используется в дум3 и не только.

Автор: Sat 16.5.2004, 08:45
Цитата
С освещением всё много проще!
Идёте на www.gametutorials.com, там ищите пример работы с multitexturing'ом.


Мне все прекрасно известно о MT, но бывают моменты, когда НЕОБХОДИМО использовать стандартное освещение. Мой случай - один из таких.

Автор: gepard 17.5.2004, 10:36
Если слишком много думать, то можно стать идиотом.
Не забывайте об этом, кодеры.

Автор: Sat 19.5.2004, 20:52
Блин, эти форумы посещает хоть один дееспособный программист? Или все горазды только сыпать третьесортными остротами и СОВЕРШЕННО БЕСПОЛЕЗНЫМИ советами?

withstupid.gif mad.gif

Автор: gepard 20.5.2004, 15:09
Я те сказал: Не парься. Почем все любят стандартные функции? Уходить от них надо и делать свои. Берёшь алгоритм отсечения фрустумом, всё что в кадре экрана - анализируешь текстуры, какие надо - увеличваешь яркость. Причём тут не обязательно увеличивать только ту часть текстуры, которую видно, моно всю.

Автор: Sat 20.5.2004, 20:14
Аррр! Я же сказал, что мне НЕОБХОДИМО использовать стандартный метод! Мне ничего не стоит провести все вышеописанные операции вручную, но в моей проге это не только не даст прироста скорости, а наоборот, снизит производительность.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)