Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 71

Карта теней от солнца

24.05.2020, 21:30. Показов 5572. Ответов 29

Студворк — интернет-сервис помощи студентам
Добрый день, есть такой вопрос: как можно реализовать карту теней от солнца, единственное, что я нашел на просторах интернета это то, что можно использовать glOrtho, но как его использовать. Поясню, моё "солнце" записывается в шейдер как единичный вектор направления солнца, то-есть нет определенной позиции, как тогда мне отрисовывать карту теней, подойдет ли перемещение камеры на расстояние чтобы видеть весь мир в рамках картинки сверху, ну или под углом солнца?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2020, 21:30
Ответы с готовыми решениями:

Карта теней
Здравствуйте. Пытаюсь сделать тени через карту теней в opengl 3.3. и тени не выводятся. вот коды: //вершинный шейдер на вывод уже с...

Создать модель движения Солнца вокруг орбиты, Земли вокруг Солнца, Луны вокруг земли
Вот есть набросок, что дальше? :help: Const pi = 3.14 Dim intRev As Single Private Sub Command1_Click() BackColor = vbBlue ...

Пример теней c#
Добрый день, буду рад Вашей помощи, нужен исходник куба 3д, или другой простой фигуры, с реализовано тенью. Желательно на c#. Спасибо

29
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.05.2020, 23:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
glOrtho(-size, size, size, -size, -near, far);
Кстати да, я тут напутал, bottom и top местами поменяй, т.е. glOrtho(-size, size, -size, size, -near, far);
0
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 71
26.05.2020, 23:29  [ТС]
zayats80888, за центр мира я беру координаты игрока (пока что) это примерно 512, 80, 512, вектор направления света я расчитываю через cos и sin угол меняется от 0 до 90и обратно от 90 до 0, поэтому направление (cos(angle), -sin(angle), 0), размер мира 256 на 256 на 256 координаты не имеют смысла ведь игрок в центре мира и он погружается и отгружается от позиции игрока, проекция света gluperspective(90, 1, 1, 1024) проекция камеры gluperspective(70, width / height, 0.05 1024), матрица вида света glrotate(90, 0, 1, 0), glrotate(90 * sin(angle), 1, 0, 0) gltranslate(-playerX + 256 * cos(angle), 256 * -sin(angle), -playerZ), матрица вида камеры gltranslate(0,0,-0.3) glrotate(xRot, 1,0,0) glrotate(yRot, 0,1,0) gltranslate(-playerX, -playerY, -playerZ) я пока с орто решил отложить работу, ибо там тоже самое, только похуже(всякие куски теневые по миру много и маленькие)
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.05.2020, 23:40
Лучший ответ Сообщение было отмечено EggoYT как решение

Решение

Цитата Сообщение от EggoYT Посмотреть сообщение
проекция света gluperspective(90, 1, 1, 1024)
эмм... а чего за числа такие странные и почему перспектива?
Попробуй glOrtho(-256, 256, -256, 256, -256, 256)
И для матрицы вида света glTranslate(-playerX, -playerY, -playerZ) (rotate оставь как есть)
1
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 71
26.05.2020, 23:51  [ТС]
zayats80888, не понимаю что странного, я завтра орто посмотрю, даже попробую скрины прислать

Добавлено через 6 минут
zayats80888, если сделать такой транслейт, то свет просто переместится в точку игрока, а так я проверял я смотрел от источника света и прокрутка была с полным обзором на мир, но вот тени не послушные)

Добавлено через 51 секунду
Ладно я попробую, может орто иначе реагирует на матртцы трансформацти
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.05.2020, 23:52
Цитата Сообщение от EggoYT Посмотреть сообщение
не понимаю что странного
Я честно говоря не понимаю как ты эту карту теней используешь, тебе ведь в шейдер нужно матрицу света то же передавать, наряду с матрицей камеры
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
26.05.2020, 23:53
Цитата Сообщение от EggoYT Посмотреть сообщение
но вот тени не послушные
так обуздай их, я так понял для миры вы используете perspective а для теней ortho?
0
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 71
26.05.2020, 23:58  [ТС]
zayats80888, здzayats80888, я записываю матрицы света и матрицы камеры а для теней как я понял нужно на gl_Vertex * gl_ModelViewMatrix это умножить на матрицы света и умножить на инвертированную матрицу модели камеры (по гайду пилил, но я думаю матрицу камеры можно оттуда вообще вырезать)

Добавлено через 33 секунды
Antikl, и там и там перспектива, но вот заяц подсказал, завтра попробую орто

Добавлено через 1 минуту
И да я использую шейдер 120 версии
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.05.2020, 00:02
Цитата Сообщение от EggoYT Посмотреть сообщение
я записываю матрицы света и матрицы камеры а для теней как я понял нужно на gl_Vertex * gl_ModelViewMatrix это умножить на матрицы света и умножить на инвертированную матрицу модели камеры
Эмм... Это надо код смотреть.
Там всё просто, передаёшь две MVP(отдельно) матрицы.
В вершинном шейдере каждую точку умножаешь отдельно на каждую матрицу. Одна идёт в gl_Position, другая просто как out.
В фрагментном шейдере сравниваешь глубину(с небольшими манипуляциями).
1
0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 71
27.05.2020, 10:45  [ТС]
zayats80888,
Тут уже рендер сцены с тенями, я достал LightMatrix из рендера карты теней (матрицы вытащил и сохранил), lightMatrix я подаю в шейдер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
            GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, cameraProjMatrix);
            GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, cameraViewMatrix);
            InverseMatrix(invertViewMatrix, cameraViewMatrix);
            invertViewMatrix.flip();
            GL11.glPushMatrix();
            GL11.glLoadIdentity();
            GL11.glTranslatef(0.5f, 0.5f, 0.5f);
            GL11.glScalef(0.5f, 0.5f, 0.5f);
            GL11.glMultMatrix(CubeOn.getCubeOn().shadow.projMatrix);
            GL11.glMultMatrix(CubeOn.getCubeOn().shadow.viewMatrix);
            GL11.glMultMatrix(invertViewMatrix);
            GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, lightMatrix);
            GL11.glPopMatrix();
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
37
38
39
40
41
42
43
44
45
#Вершинный
#version 120
 
varying vec2 texcoord;
varying vec4 lpos;
varying vec3 normal;
 
uniform mat4 lightMatrix;
 
void main(){
    vec4 vpos = gl_ModelViewMatrix * gl_Vertex;
    lpos = lightMatrix * vpos;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    
    normal = gl_Normal;
    
    gl_FrontColor = gl_Color;
    
    texcoord = vec2(gl_MultiTexCoord0);
}
 
#фрагментный
#version 130
 
uniform sampler2D colormap;
 
uniform sampler2D shadowMap;
uniform vec3 lightDir;
 
varying vec2 texcoord;
varying vec3 normal;
varying vec4 lpos;
 
void main(){
    vec3 smcoord = lpos.xyz / lpos.w;
    if(smcoord.z > 1)
        smcoord.z = 1;
    float shadow = float(smcoord.z <= texture2D(shadowMap, smcoord.xy).x) / 2.0;
    
    shadow += 0.5;
    
    float diffuse = max(dot(normalize(normal), normalize(-lightDir)), 0.0);
    
    gl_FragColor = vec4(texture2D(colormap, texcoord).xyz  * shadow, 1.0);
}
это шейдеры рендера
Источник откуда брал все материалы: https://www.gamedev.ru/code/articles/ShadowMapGLSL

Добавлено через 12 минут
zayats80888,
Цитата Сообщение от zayats80888 Посмотреть сообщение
И для матрицы вида света glTranslate(-playerX, -playerY, -playerZ) (rotate оставь как есть)
Слушай, а как ты догадался так сделать, я так сделал все получилось... не знаю как это работает но работает, типо я делал аналог, ставил камеру от лица света и проводил все операции, однако.... при малейшем движении игрока тени скачут... еще заметил glOrtho надо увеличить zfar ибо на 90 градусов он просто не видит мир, ну или убрать перемещении по y игрока, как мне сделать тени статичнее, суть то в том что игрок движется, а еще мир изменяем (можно ставить объекты, кубы там), и еще куски мира прогружаются в зависимости от перемещения игрока

Добавлено через 27 минут
В общем всем спасибо, я сделал так, у меня мир на куски разбит и перемещение источника света происходит не на координаты игрока, а на координаты начала этого куска, также я вернул диффузное освещение и теперь все выглядит статично, спасибо! Сейчас буду думать как сделать тень плавной при перемещении солнца, ибо дергаица
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
28.05.2020, 09:41
Цитата Сообщение от Antikl Посмотреть сообщение
а можно к примеру записать карту теней
Тогда по идее можно легко имитировать очень сложные и качественные тени на большой плоскости.
Хранить в векторной форме координаты вершин треугольников и двигать их как функцию от положения тела… но вот отбрасывать они никуда не будут. Зато красивые и быстрые.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2020, 09:41

Нет теней
Ребят, нет теней в Directional Light, почему? Когда создаю новый проэкт, они есть, потом они резко выключаются.(стоит Soft Shadows)

Центрирование теней
Тень создается с помощью кода: &lt;div style=&quot;background-color: #4a1e22; text-align:center;&quot;&gt;&lt;p style=&quot;position: relative; top: 0px;...

Построение теней
Нужна, собственно говоря помощь с построением собственной тени сферы и тела вращения и падающей тени сферы на тело вращения. Помогите...

Где можно почитать о создании теней
Привет. Пишу простенький движок. Пока что сделал простенькое отображение объектов, свободную камеру, текстуры и т.д. И вот дошло дело...

Создание теней для объектов в OpenGL
Прошу помочь или хотя бы подсказать. Во вложении программа, которая рисует комнату с зеркалом (отражения реализовал) и несколькими...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru