Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/64: Рейтинг темы: голосов - 64, средняя оценка - 4.91
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268

OpenGL: освещение

04.06.2010, 16:44. Показов 13604. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как на OpenGL сделать освещение (в т. ч. и тени)?
Пробовал много способов, в большинстве случаев все объекты становились одного цвета.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2010, 16:44
Ответы с готовыми решениями:

Освещение в OpenGL, C++
Здравствуйте. Я новичок в OpenGL, и мне в университете дали задание обработать программу таким образом, чтобы был объект, источник света и...

Освещение OpenGL
Добрый вечер! Создала в OpenGL пирамиду, которая вращается по нажатию клавиш, и пытаюсь сделать ей освещение. Перечитала несколько...

Освещение обьекта в OpenGL
Решил сделать что-то вроде модели солнечной системы. Внезапно возникли такие проблемы: 1) Свет должен исходить из 1 точки (центра...

57
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
22.07.2010, 18:20  [ТС]
Студворк — интернет-сервис помощи студентам
snake32, мне пока нужна только помощь с освещением и курсором)
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
22.07.2010, 18:36
короче, берёте первые три вершины квадрата(p1, p2,p3)
Вычитаете
v1 = p2-p1;
v2 = p3-p1;
получаются два вектора из одной вершины(p1)
далее делаете вектроное произведение этих векторов, нормализуете результат, получаете НОРМАЛЬ для всего квада. Вот и всё. )
1
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
22.07.2010, 19:57  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
далее делаете вектроное произведение этих векторов, нормализуете результат, получаете НОРМАЛЬ для всего квада
можете подсказать, как? просто я не очень силён в математике такого уровня
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
22.07.2010, 20:22
C++
1
2
3
4
inline Vector3D operator ^ ( const Vector3D& u, const Vector3D& v )
{
    return Vector3D (u.y*v.z-u.z*v.y, u.z*v.x-u.x*v.z, u.x*v.y-u.y*v.x);
}
вот кусок кода, отсюда =>
C++
1
2
3
x = u.y*v.z-u.z*v.y;
y = u.z*v.x-u.x*v.z;
z = u.x*v.y-u.y*v.x;
Добавлено через 1 минуту
это векторное произведение между векторами u и v (uxv)

Добавлено через 2 минуты
Как нормализовать вектор я уже писал выше
1
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
22.07.2010, 20:23  [ТС]
u и v - это v1 и v2 отсюда
Цитата Сообщение от snake32 Посмотреть сообщение
v1 = p2-p1;
v2 = p3-p1;
?
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
22.07.2010, 20:30
Цитата Сообщение от Kidalvь Посмотреть сообщение
u и v - это v1 и v2 отсюда
Цитата Сообщение от snake32 Посмотреть сообщение
v1 = p2-p1;
v2 = p3-p1;
?
да. Учтите, что здесь важен порядок перемножения, если всё будет неправильно освещатся(обычно чёрным), то поменяйте порядок перемножения. И перечисляйте вершины всех квадов в одном порядке. По часовой или против.
1
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
22.07.2010, 20:53  [ТС]
спасибо
только есть одна проблема: освещаются только большие, наклонённые и расположенные близко квадраты, остальные просто серые (даже тогда, когда они должны быть синими)

Добавлено через 2 минуты
и только одна сторона
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
22.07.2010, 21:10
Цитата Сообщение от Kidalvь Посмотреть сообщение
и только одна сторона
Обычно вторая сторона вообще отсекается(glEnable(GL_CULL_FACE)), а если объект тонкий то рисуют 2 квадрата как бы склеивают задними гранями, а лицывые смотрят наружу.
Вприципе можно пока не загонятся по этому поводу и просто включить освещение с двух сторон
glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, TRUE);

первая проблема пока мне непонятна, можете скинуть скриншот?
1
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
22.07.2010, 21:22  [ТС]
насчёт наклоненных был не прав, наверное, потому что освещается при определённом углу не положения квадрата, а камеры.
Смотрю дальше: функция glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, TRUE) сделала нормальное освещение с одной стороны и такое, как я описал выше - на другой.
Скриншоты:
одна сторона большого квадрата:

та же сторона, только дальше:

и другая сторона:

любая сторона более маленьких квадратов выглядит так:

и при любом расстоянии.
Все квадраты должны быть синими
0
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
22.07.2010, 21:28  [ТС]
с той стороной, с которой всё нормально, тоже не так гладно - при определённых поворотах камеры тоже всё серое. А если наложить один на другой квадрат, то при определённых углах они становятся либо невидимыми, либо чёрными.
Про другую сторону - всё нормально с близкого расстояния.
Вот ещё один скриншот (сторона, которая совсем странно работает):
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
23.07.2010, 10:51
Цитата Сообщение от Kidalvь Посмотреть сообщение
Вот ещё один скриншот (сторона, которая совсем странно работает)
похоже на то что левая нижняя вершина квада имеет другую нормаль в отличае от первых 3х. Либо что-то с настройками света... какой тип источника?
0
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
23.07.2010, 10:53  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
float pos[4] = {0.5,0.5,0.5,1};
float dir[4] = {0.5,0.5,0.5,1};
float color[4] = {0,0,1,1};
float front_color[4] = {0,0,1,1};
float back_color[4] = {0,0,1,1};
//...
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
        
glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, true);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
    
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
glMaterialfv(GL_FRONT, GL_DIFFUSE, front_color);
glMaterialfv(GL_BACK, GL_DIFFUSE, back_color);
glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
                            
glLighti(GL_LIGHT0, GL_SPOT_EXPONENT, 0); 
glLighti(GL_LIGHT0, GL_SPOT_CUTOFF, 90);
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
23.07.2010, 11:15
У вас прожектор.(линия 13, 20, 21)
http://compgraphics.info/OpenG... ources.php
Попробуйте просто направленный источник
C++
1
2
3
4
5
6
7
8
9
10
11
12
float pos[4] = {0.5, 0.5, 0.5, 0.0};
float color[4] = {0,0,1,1};
//...
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
                
glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, true);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
        
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE_AND_AMBIENT, color);
glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE_AND_AMBIENT);
Как-то так...

Добавлено через 2 минуты
DIFFUSE - это и есть основной цвет,
AMBIENT - этот цвет будет если совсем интенсивность освещения нулевая, то есть полная тень
1
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
23.07.2010, 11:26  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
GL_DIFFUSE_AND_AMBIENT
не знает такого:
error: ‘GL_DIFFUSE_AND_AMBIENT’ was not declared in this scope
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
23.07.2010, 12:29
Цитата Сообщение от Kidalvь Посмотреть сообщение
не знает такого:
error: ‘GL_DIFFUSE_AND_AMBIENT’ was not declared in this scope
Ой перепутал
GL_AMBIENT_AND_DIFFUSE = $1602; // это из Delphi
0
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
23.07.2010, 12:39  [ТС]
хм...
Сверху:

чем больше квадрат - тем он, почему-то, белее. Тут есть и те, которые слились с самым большим
Снизу:


может, что-то не так с нормалями?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
ads.x=ps[i][0]+(cos(ps[i][5])*ps[i][6]);
ads.y=ps[i][1]-(cos(ps[i][4])*ps[i][6]);
ads.z=ps[i][2]-(sin(ps[i][4])*ps[i][6])+sin(ps[i][5])*ps[i][6];
                            
ada.x=ps[i][0]-(cos(ps[i][5])*ps[i][6]);
ada.y=ps[i][1]-(cos(ps[i][4])*ps[i][6]);
ada.z=ps[i][2]-(sin(ps[i][4])*ps[i][6])-sin(ps[i][5])*ps[i][6];
                            
adf.x=ps[i][0]-(cos(ps[i][5])*ps[i][6]);
adf.y=ps[i][1]+(cos(ps[i][4])*ps[i][6]);
adf.z=ps[i][2]+(sin(ps[i][4])*ps[i][6])-sin(ps[i][5])*ps[i][6];
                            
adg.x=ps[i][0]+(cos(ps[i][5])*ps[i][6]);
adg.y=ps[i][1]+(cos(ps[i][4])*ps[i][6]);
adg.z=ps[i][2]+(sin(ps[i][4])*ps[i][6])+sin(ps[i][5])*ps[i][6];
                            
v1.x=ada.x-ads.x;
v1.y=ada.y-ads.y;
v1.z=ada.z-ads.z;
                            
v2.x=adf.x-ads.x;
v2.y=adf.y-ads.y;
v2.z=adf.z-ads.z;
                            
cc.x=v1.y*v2.z-v1.z*v2.y;
cc.y=v1.z*v2.x-v1.x*v2.z;
cc.z=v1.x*v2.y-v1.y*v2.x;
                            
glNormal3f(cc.x,cc.y,cc.z);
glVertex3f(ads.x,ads.y,ads.z);
glNormal3f(cc.x,cc.y,cc.z);
glVertex3f(ada.x,ada.y,ada.z);
glNormal3f(cc.x,cc.y,cc.z);
glVertex3f(adf.x,adf.y,adf.z);
glNormal3f(cc.x,cc.y,cc.z);
glVertex3f(adg.x,adg.y,adg.z);
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
23.07.2010, 13:28
Цитата Сообщение от Kidalvь Посмотреть сообщение
чем больше квадрат - тем он, почему-то, белее.
гы-гы. Геометрический смысл векторного произведения - длина результирующего вектора есть площадь параллелограмма образованного входными векторами. Вы забыли нормализовать этот вектор. я же писал:
Цитата Сообщение от snake32 Посмотреть сообщение
далее делаете вектроное произведение этих векторов, нормализуете результат, получаете НОРМАЛЬ для всего квада.
Добавлено через 1 минуту
нормализуйте вектор сс и должно корректно отображать

Добавлено через 1 минуту
На сколько знаю можно 1 раз указать нормаль и последующие вершины будут устанавливаться с последней установленой нормалью
C++
1
2
3
4
5
glNormal3f(cc.x,cc.y,cc.z);
glVertex3f(ads.x,ads.y,ads.z);
glVertex3f(ada.x,ada.y,ada.z);
glVertex3f(adf.x,adf.y,adf.z);
glVertex3f(adg.x,adg.y,adg.z);
1
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
23.07.2010, 13:48  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
нормализуйте вектор сс и должно корректно отображать
так?
C++
1
2
3
4
length=sqrt(cc.x*cc.x+cc.y*cc.y+cc.z*cc.z);                         
cc.x/=length;
cc.y/=length;
cc.z/=length;
теперь все квадраты меняют свой цвет в зависимости от поворота камеры. Только этот цвет у всех одинаковый - сливаются. Зато нет зависимости от размера
0
 Аватар для snake32
3599 / 1731 / 236
Регистрация: 26.02.2009
Сообщений: 8,802
Записей в блоге: 5
23.07.2010, 14:02
Цитата Сообщение от Kidalvь Посмотреть сообщение
теперь все квадраты меняют свой цвет в зависимости от поворота камеры
Это нормально, если с камерой двигается источник света( позиция света тоже зависит от матрицы MODELVIEW)
Цитата Сообщение от Kidalvь Посмотреть сообщение
Только этот цвет у всех одинаковый - сливаются.
И совсем не зависит от положения квада в пространстве??
Цвет нужно устанавливать перед каждым квадом свой если он разный:
C++
1
2
3
4
5
6
glNormal3f(cc.x,cc.y,cc.z);
glColor3f( R, G, B );// цвет квада вершины которого заданы далее
glVertex3f(ads.x,ads.y,ads.z);
glVertex3f(ada.x,ada.y,ada.z);
glVertex3f(adf.x,adf.y,adf.z);
glVertex3f(adg.x,adg.y,adg.z);
0
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
23.07.2010, 14:06  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
И совсем не зависит от положения квада в пространстве??
не зависит.
цвет у них одинаковый...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.07.2010, 14:06

OpenGl. (Delphi). Освещение
Помогите, плиииизз. не очень поняла освещение. как сделать включить освещение наподобие солнца (т.е. один источник сверху или т.п.).

Цвет и освещение в OpenGL
Столкнулся с такой проблемой, что когда включено освещение, то цветные объекты превращаются в чёрно-белые. Хотя стороны куба освещаются...

Освещение в OpenGL без шейдеров
Пришлось на старости лет осваивать GL. До этого пользовался DirectX и самописным софтверным рендером. Естественно что и там и там освещение...

OpenGL. Освещение и GL_TRIANGLE_STRIP режим
Для корректной работы освещения нужно задавать нормали для каждой точки модели. Не могу понять, как задавать нормали для каждого...

OpenGL. GL_TRIANGLE_FAN освещение первой вершины
Здравствуйте. Я недавно решил заняться изучением OpenGL и вот у меня возникла проблема с освещением: с помощью GL_TRIANGLE_FAN я рисую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru