forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   GLSL освещение (http://forum.boolean.name/showthread.php?t=19532)

pozitiffcat 22.11.2014 01:05

GLSL освещение
 
Привет всем. Немогу нигде найти решения, может знатоки подскажут.
Есть три типа освещения, направленный, точечный и прожектор. Так вот, как это все запилить в одном шейдере? Как это делают? Я что-то не нашел...
Не делать же if (light_type[i] == 0) {} else if .....
Кто нибудь поможет?

Mr_F_ 22.11.2014 01:47

Ответ: GLSL освещение
 
А сколько лайтов-то, один?
Чем 3 разных шейдера не угодили?

Цитата:

[i]
видимо не один.
ну, в общем, вариантов очень много, и тут всегда есть над чем подумать. идеального решения нет.
можно иметь несколько вариаций шейдера с разными комбинациями. можно их руками написать, можно составлять из кусков кода автоматически.
если максимальное число лайтов мало, можно юзать #ifdef, если не очень мало, то генерация шейдеров становится уже целой отдельной большой задачей. свои изыскания в этой области описывал тут: http://ndotl.wordpress.com/2014/10/1...shader-system/

можно делать деферед - тогда всё намного проще в этом плане.

pozitiffcat 23.11.2014 00:44

Ответ: GLSL освещение
 
Вобщем за проход нужно обработать все 3 варианта. Тоесть на сцене есть 3 источника трех типов. На данном этапе, как раз таки убер шейдер, но тут он не спасает.

PS. Это я тут собрался GLES3 прикрутить, да по нормальному,с качественной картинкой

pozitiffcat 23.11.2014 23:49

Ответ: GLSL освещение
 
Вложений: 1
Еще со спекуляром херня какая-то, вообще не понимаю почему так.
Кто нибудь может объяснить, что за полоску он мне ривует.
Источник в левом дальнем углу

PHP код:

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 0int(_lights_count_); ++i)
  {
    
vec3 light_pos _light_position_[i];
    
vec3 light_dir normalize(light_pos position);
    
    
vec3 latt vec3(1.00.10.01) * 0.5;
    
float dist length(light_pos position);
    
float att 1.0 / (latt.latt.dist latt.dist dist);
    
    
vec3 l  normalize(light_pos position);
    
vec3 v  normalize(-position);
    
vec3 h  normalize(v);
    
    
spec += pow(max(0.0dot(hnormal)), 28.0) * att;
    
light_factor += max(dot(normallight_dir), 0.0) * att;
  }
  
  
  
gl_FragColor texture2D(_diffuse_map_texture_texcoord_1) * light_factor spec;



Черный крыс 24.11.2014 00:55

Ответ: GLSL освещение
 
Цитата:

Сообщение от pozitiffcat (Сообщение 289624)
Еще со спекуляром херня какая-то, вообще не понимаю почему так.
Кто нибудь может объяснить, что за полоску он мне ривует.
Источник в левом дальнем углу

Ты же сам хотел спекуляр...

HolyDel 24.11.2014 01:17

Ответ: GLSL освещение
 
похоже на косяки с tbn

Mr_F_ 24.11.2014 01:52

Ответ: GLSL освещение
 
Цитата:

vec3 v = normalize(-position);
эмм... тут разве не должно быть normalize(position - cameraPos)? спекуляр же view-dependent.
(знак может быть в другую сторону)

pozitiffcat 24.11.2014 08:54

Ответ: GLSL освещение
 
Вложений: 1
Приогромнейшее спасибо )). Как я сам не догадался. Сталкивался когда-то уже.
vec3 v = normalize(_camera_position_ - position);

pozitiffcat 25.11.2014 22:22

Ответ: GLSL освещение
 
Ребят. Кто подскажет? Использую отложенное освещение. Нужно заюзать emissive материала, как правильно это делают?

Mr_F_ 25.11.2014 23:23

Ответ: GLSL освещение
 
Я бы emissive цвет запёк в альбедо г-буфера, дальше тогда остаётся единичное значение (силу свечения) где-то держать. Хватило бы одноканальной 8-бит текстуры, но в идеале бы ещё куда-нибудь впихнуть. Какая у тебя сейчас раскладка г-буфера?

pozitiffcat 25.11.2014 23:31

Ответ: GLSL освещение
 
position.xyz,depth
normal.xyz,0
diffuse.xyz,0
два свободных канала

Mr_F_ 25.11.2014 23:34

Ответ: GLSL освещение
 
Цитата:

position.xyz,depth
жырнота даже для мощных платформ.
достаточно одной глубины, позиция из неё и данных о камере восстанавливается.

Цитата:

normal.xyz,0
с какой точностью хранишь, кстати?

Цитата:

два свободных канала
ну вот как раз влезает

pozitiffcat 25.11.2014 23:44

Ответ: GLSL освещение
 
GL_GLOAT, насчет позиций я где-то видел как получают из глубины

mr.DIMAS 25.11.2014 23:54

Ответ: 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 - восстановленная позиция

Mr_F_ 26.11.2014 00:18

Ответ: GLSL освещение
 
Цитата:

GL_GLOAT
жыр, можно хорошо впихнуть в ргба8, гугли крайтековские доки про best-fit normals


Часовой пояс GMT +4, время: 23:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot