0 / 0 / 0
Регистрация: 19.11.2018
Сообщений: 71

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

24.05.2020, 21:30. Показов 5616. Ответов 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
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
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
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
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
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
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
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
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, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты 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) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru