Честно говоря, мне показалось более рациональным вместо
OUT.position.x=OUT.position.x/(abs(OUT.position.x)+1.0f);
OUT.position.y=OUT.position.y/(abs(OUT.position.y)+1.0f);
Использовать необходимое сжатие, что бы только видимая камере геометрия попадала в карту глубины тени. Для этого необходимо подсчитать нужные коэффициенты и передать в шейдер.
График ф-и: График
Если нам известны позиции дальних объектов, видимых из камеры, то мы можем расчитать a и b такие, что все видимые объекты попадут в карту теней, а остальные не будут занимать необходимие пиксели. Для x и для y соотв-но по два таких коэффициента.
Лучше почитать http://www.cspaul.com/publications/Rosen.2012.I3D.pdf - Rectilinear Texture Warping for Fast Adaptive Shadow Mapping - в статье про него и сказано.
eagle
> Какой в этом смысл?
в том что ближняя геометрия тоже настраиваемая, и ее можно сделать крупнее.
Caostick
> Использовать необходимое сжатие, что бы только видимая камере геометрия
> попадала в карту глубины тени. Для этого необходимо подсчитать нужные
> коэффициенты и передать в шейдер.
это же и есть PSM/TSM техники, и их косяки тоже упомянуты в статье.
я тестил демки перспективных техник, они в динамике хуже всего что я встречал в жизни, лучше тогда CSM уже.
Caostick
> Если нам известны позиции дальних объектов, видимых из камеры
не все так просто, то что влазит в экран из геометрии - пофигу, нельзя под эту информацию оптимизировать SM, потому что геометрия может быть СЗАДИ за камерой, ее не видно, но она должно быть в шедоумапе, поскольку отбрасывает тень на то что в камеру попадает =)
вы уж извините, я от дискуссии отключусь на неделю... болею.
Аврелий
Да, точно. Невнимательно как-то я к этому отнесся. Просто тестирую на камере для сцен с "видом-изометрией" и там практически вся необходимая геометрия находится в области видимости камеры, за камерой только птицы.
Хотя, ничто не мешает отдалить заднюю границу или увеличить параметр.
Техника хорошая!
Статья хорошая!
Немного отталкивает необходимость тесселирования объектов.
Аврелий, када выходит твоя игра с этим методом? =)
Пытаюсь прикрутить этот способ к своим теням, что-то не выходит. Тени оказываются далеко не на своем месте. Шадоу мапа вроде нормально строится, а вот с ее наложение проблемы. Грешу на матрицы.
Шейдер рендера шадоу мапа:
#version 120 uniform mat4 lightMatrix; varying vec4 pos; void main(void) { pos = gl_ModelViewProjectionMatrix * gl_Vertex; pos.x = pos.x / (abs(pos.x)+1.0); pos.y = pos.y / (abs(pos.y)+1.0); gl_Position = pos; } #version 120 varying vec4 pos; void main(void) { gl_FragColor = vec4( pos.z * 0.5 + 0.5 ); }
Наложение теней:
vec4 vpos = gl_ModelViewMatrix * gl_Vertex; lpos = lightMatrix * vpos; lpos.x = lpos.x /(abs(lpos.x)+1.0); lpos.y = lpos.y /(abs(lpos.y)+1.0); smcd.xyz = lpos.xyw; smcd.w = lpos.z - 0.0007;
Кирюха
> smcd.xyz = lpos.xyw;
> smcd.w = lpos.z - 0.0007;
моя не понимать эти строки ))
fzr125
это смещение базиса по ходу
Кирюха
может где y и z местами поменялись
или тут:
>vec4 vpos = gl_ModelViewMatrix * gl_Vertex;
gl_ModelViewMatrix - это матрица объекта * матрица вида?
должна быть матрица объекта только, поскольку матрица лампочки на сколько я помню и есть Proj*View света
float4 posL=mul(mul(IN.position,matWorld),matLight); /////////////////////////////////// posL.x=posL.x/(abs(posL.x)+1.0f); // место "1.0f" должен быть тот же коэффициент что и в шейдере глубины. posL.y=posL.y/(abs(posL.y)+1.0f); /////////////////////////////////// OUT.SMCD.xyz=posL.xyw; //SMCD - текстурные координаты наложения теневой карты на сцену. OUT.SMCD.x*=0.5f; OUT.SMCD.y=-OUT.SMCD.y*0.5f; OUT.SMCD.w=posL.z-0.0007f; //базис...
куда дел эти строки? это как раз корректировка координат чтобы они попали куда надо сжать по X отразить и сжать по Y...
OUT.SMCD.x*=0.5f;
OUT.SMCD.y=-OUT.SMCD.y*0.5f;
Вернул на место smcd.x*=0.5; smcd.y=-smcd.y*0.5; , не помогло.
Пробовал передавать матрицу модели в шейдре, т.е :
lpos = lightMatrix * (modelMatrix*gl_Vertex);
Результат тот же.
Кирюха
Ты бы обычные шадоумапы сначала сделал, а потом уже GPSM прикручивал.
Executor
Обычную уже делал.
Кирюха
Проверь, точно ли те что надо матрицы передаешь, а вобще сложно както исправлять чужие проблемы.
На самом деле - делай обычные шадоумапы, и просто введи нужные модификации в оба шейдера. По идее трудностей не должно быть.
Executor, эту штуковину по второму варианту из твоей статьи прикрутить можно ? =) (без перерисовки глубины в квад)
ai-music
Я не пробовал текущую технику, поэтому не знаю насколько тот мой старый код теней к этому подойдёт.
Все еще пытаюсь сделать GPSM. Обычная шадоу мапа отлично работает, но как только добавляю все что связанно с этой техникой начинаются глюки.
Вопрос по матрицам, точнее как их считать:
matAll = LightOrthoMatrix * LightViewMatrix * ModelMatrix matWorld = матрица модели matLight = LightProjMatrix = LightOrthoMatrix* LightViewMatrix
Все верно?
Тема в архиве.