|
22.11.2014, 01:05
|
#1
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
GLSL освещение
Привет всем. Немогу нигде найти решения, может знатоки подскажут.
Есть три типа освещения, направленный, точечный и прожектор. Так вот, как это все запилить в одном шейдере? Как это делают? Я что-то не нашел...
Не делать же if (light_type[i] == 0) {} else if .....
Кто нибудь поможет?
|
(Offline)
|
|
22.11.2014, 01:47
|
#2
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: GLSL освещение
А сколько лайтов-то, один?
Чем 3 разных шейдера не угодили?
видимо не один.
ну, в общем, вариантов очень много, и тут всегда есть над чем подумать. идеального решения нет.
можно иметь несколько вариаций шейдера с разными комбинациями. можно их руками написать, можно составлять из кусков кода автоматически.
если максимальное число лайтов мало, можно юзать #ifdef, если не очень мало, то генерация шейдеров становится уже целой отдельной большой задачей. свои изыскания в этой области описывал тут: http://ndotl.wordpress.com/2014/10/1...shader-system/
можно делать деферед - тогда всё намного проще в этом плане.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
23.11.2014, 00:44
|
#3
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: GLSL освещение
Вобщем за проход нужно обработать все 3 варианта. Тоесть на сцене есть 3 источника трех типов. На данном этапе, как раз таки убер шейдер, но тут он не спасает.
PS. Это я тут собрался GLES3 прикрутить, да по нормальному,с качественной картинкой
|
(Offline)
|
|
23.11.2014, 23:49
|
#4
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: GLSL освещение
Еще со спекуляром херня какая-то, вообще не понимаю почему так.
Кто нибудь может объяснить, что за полоску он мне ривует.
Источник в левом дальнем углу
uniform sampler2D _position_map_texture_; uniform sampler2D _bump_map_texture_; uniform sampler2D _diffuse_map_texture_;
uniform float _lights_count_; uniform vec3 _light_position_[4];
void main() { vec3 position = texture2D(_position_map_texture_, texcoord_1).xyz; vec3 normal = texture2D(_bump_map_texture_, texcoord_1).xyz; float spec = 0.0; float light_factor = 0.0; for (int i = 0; i < int(_lights_count_); ++i) { vec3 light_pos = _light_position_[i]; vec3 light_dir = normalize(light_pos - position); vec3 latt = vec3(1.0, 0.1, 0.01) * 0.5; float dist = length(light_pos - position); float att = 1.0 / (latt.x + latt.y * dist + latt.z * dist * dist); vec3 l = normalize(light_pos - position); vec3 v = normalize(-position); vec3 h = normalize(l + v); spec += pow(max(0.0, dot(h, normal)), 28.0) * att; light_factor += max(dot(normal, light_dir), 0.0) * att; } gl_FragColor = texture2D(_diffuse_map_texture_, texcoord_1) * light_factor + spec; }
|
(Offline)
|
|
24.11.2014, 00:55
|
#5
|
|
Ответ: GLSL освещение
Сообщение от pozitiffcat
Еще со спекуляром херня какая-то, вообще не понимаю почему так.
Кто нибудь может объяснить, что за полоску он мне ривует.
Источник в левом дальнем углу
|
Ты же сам хотел спекуляр...
|
|
|
24.11.2014, 01:17
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: GLSL освещение
похоже на косяки с tbn
|
(Offline)
|
|
24.11.2014, 01:52
|
#7
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: GLSL освещение
vec3 v = normalize(-position);
|
эмм... тут разве не должно быть normalize(position - cameraPos)? спекуляр же view-dependent.
(знак может быть в другую сторону)
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
24.11.2014, 08:54
|
#8
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: GLSL освещение
Приогромнейшее спасибо )). Как я сам не догадался. Сталкивался когда-то уже.
vec3 v = normalize(_camera_position_ - position);
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pozitiffcat за это полезное сообщение:
|
|
25.11.2014, 22:22
|
#9
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: GLSL освещение
Ребят. Кто подскажет? Использую отложенное освещение. Нужно заюзать emissive материала, как правильно это делают?
|
(Offline)
|
|
25.11.2014, 23:23
|
#10
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: GLSL освещение
Я бы emissive цвет запёк в альбедо г-буфера, дальше тогда остаётся единичное значение (силу свечения) где-то держать. Хватило бы одноканальной 8-бит текстуры, но в идеале бы ещё куда-нибудь впихнуть. Какая у тебя сейчас раскладка г-буфера?
|
(Offline)
|
|
25.11.2014, 23:31
|
#11
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: GLSL освещение
position.xyz,depth
normal.xyz,0
diffuse.xyz,0
два свободных канала
|
(Offline)
|
|
25.11.2014, 23:34
|
#12
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: GLSL освещение
жырнота даже для мощных платформ.
достаточно одной глубины, позиция из неё и данных о камере восстанавливается.
с какой точностью хранишь, кстати?
ну вот как раз влезает
|
(Offline)
|
|
25.11.2014, 23:44
|
#13
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: GLSL освещение
GL_GLOAT, насчет позиций я где-то видел как получают из глубины
|
(Offline)
|
|
25.11.2014, 23:54
|
#14
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: GLSL освещение
например так ( кусок из моего движка, в подписи есть ссылка на гитхаб, там можешь поглядеть на деферед с оптимизациями )
" float depth = tex2D( depthSampler, texcoord ).r;\n"
" float4 screenPosition;\n"
" screenPosition.x = texcoord.x * 2.0f - 1.0f;\n"
" screenPosition.y = -( texcoord.y * 2.0f - 1.0f );\n"
" screenPosition.z = depth;\n"
" screenPosition.w = 1.0f;\n"
" float4 p = mul( screenPosition, invViewProj );\n"
" p /= p.w;\n"
p - восстановленная позиция
__________________
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо mr.DIMAS за это полезное сообщение:
|
|
26.11.2014, 00:18
|
#15
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: GLSL освещение
жыр, можно хорошо впихнуть в ргба8, гугли крайтековские доки про best-fit normals
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:46.
|