Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Освещение в OpenGl |
Автор: Sheff 27.7.2002, 00:20 | ||
У меня проблема с освещением в OpenGl, короче так, я задаю источник света:
Потом рисую сферу с помощью gluSphere и плоскость с помощью glBegin(GL_QUADS). Притом сфера освещается нормально, т.е часть её может быть в тени, а чать освещена, всё так как я хотел, но вот с плоскостью проблемы, она всегда либо вся светлая, либо вся в тени. Как сделать так чтобы источник света освещал плоскость так же правильно как и сферу ? |
Автор: Mikel 28.7.2002, 20:45 |
А в OpenGL такого нету. ![]() Попробуй библиотеку glScene(может есть для C++) |
Автор: Sheff 28.7.2002, 21:39 |
Есть, просто надо сначала рисовать объект, а потом свет ![]() |
Автор: Mikel 29.7.2002, 18:41 |
У меня даже в книге написано, что нету ![]() ![]() |
Автор: Sheff 29.7.2002, 23:07 | ||
Это есть в стандартном OpenGL, просто сначала надо рисовать объекты,а потом свет с помощью glLight и всё получается ![]() А можно ещё разбить плоскость на треугольники, тогда освещение просто абалденное ![]() |
Автор: Mikel 30.7.2002, 07:37 |
OK, попробую. ![]() |
Автор: 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 | ||
Мне все прекрасно известно о MT, но бывают моменты, когда НЕОБХОДИМО использовать стандартное освещение. Мой случай - один из таких. |
Автор: gepard 17.5.2004, 10:36 |
Если слишком много думать, то можно стать идиотом. Не забывайте об этом, кодеры. |
Автор: Sat 19.5.2004, 20:52 |
Блин, эти форумы посещает хоть один дееспособный программист? Или все горазды только сыпать третьесортными остротами и СОВЕРШЕННО БЕСПОЛЕЗНЫМИ советами?![]() ![]() |
Автор: gepard 20.5.2004, 15:09 |
Я те сказал: Не парься. Почем все любят стандартные функции? Уходить от них надо и делать свои. Берёшь алгоритм отсечения фрустумом, всё что в кадре экрана - анализируешь текстуры, какие надо - увеличваешь яркость. Причём тут не обязательно увеличивать только ту часть текстуры, которую видно, моно всю. |
Автор: Sat 20.5.2004, 20:14 |
Аррр! Я же сказал, что мне НЕОБХОДИМО использовать стандартный метод! Мне ничего не стоит провести все вышеописанные операции вручную, но в моей проге это не только не даст прироста скорости, а наоборот, снизит производительность. |