Войти
ПрограммированиеФорумГрафика

Не выходят omni shadows

Страницы: 1 2 313 14 Следующая »
#0
22:25, 22 июня 2011

Вот опять вернулся к этой теме..

сейчас хотя бы достойные хард шадовс получить бы
делаю обычные кубемап тени .. кубемап float32

1) создаю куб мап

uint CreateNewCube(int res)
{
  uint Texture;

  // Create a new cube map.
  glEnable(GL_TEXTURE_CUBE_MAP_ARB);
  glGenTextures(1, &Texture);
  glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, Texture);

  glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

  uint mode=GL_RGBA,internalformat=GL_RGBA32F_ARB;
  uint type=GL_FLOAT;

  for(int i = 0 ;i< 6;i++) glTexImage2D(cubemap_define_arb[i],0,internalformat,res,res,0,mode,type,NULL);
 
  glDisable(GL_TEXTURE_CUBE_MAP_ARB);  

  return Texture;
}

2) создаю FBO с depth24

3) рисую в кубемап

uniform vec3 lightPos;

void main(){
     gl_TexCoord[0].xyz = gl_Vertex.xyz - lightPos;
     gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz,1);
}


void main() 
{ 
     gl_FragColor.a = length(gl_TexCoord[0].xyz);
}

все в ворлд спейсе... геометрия статична - поэтому юзаю просто gl_Vertex без домножения на матрицу объекта

4) lightpass

uniform vec3 lightPos;

void main()
{
  gl_TexCoord[0].xyz = gl_Vertex.xyz-lightPos ;
  gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz,1);
}



uniform samplerCUBE Shadow;
uniform float invRadius;

void main() 
{
  vec3 LightVec = gl_TexCoord[0];

  float zoffset=0;//0.03;

  float depth = textureCube(Shadow, LightVec).a*invRadius+zoffset;
  float thisDepth = 
      length(LightVec)*invRadius;
        
  bool shadow = thisDepth < depth;

  gl_FragColor = shadow 
}

....................................
резалты ужасны

при биасе =0

http://dl.dropbox.com/u/5862637/R.f.d000.jpg

при биасе отличном от нуля

http://dl.dropbox.com/u/5862637/R.f.d-001.jpg

одни обрубки... я чесн - ни у кого такого кошмара не видел ))


#1
22:53, 22 июня 2011

Собственно, у тебя все правильно работает ) Именно так как и должно быть.
Дальше есть различные техники.
Все сводиться к динамическому биасу. Т.е. расчитывать его для каждого конкретного случая.
Его можно корректировать учитывая угол между нормалью поверхности и направлением к источнику света.
Ищи по Dynamic shadow map bias
Например, вот
http://www.dissidentlogic.com/images/NormalOffsetShadows/GDC_Post… malOffset.png

#2
0:12, 23 июня 2011

спасиб.... я так понял мой диагноз

Shadow acne///


///////

#3
2:50, 23 июня 2011

> float depth = textureCube(Shadow, LightVec).a*invRadius+zoffset;
LightVec не надо нормализовывать?

#4
9:53, 23 июня 2011

Blew_zc
> LightVec не надо нормализовывать?
не надо

#5
21:24, 23 июня 2011

2VirT

1)
Я смотрю скан что ты дал

этот оффсет надо делать када пишу в кубемап как я понял?

вычислять все со смещенным вертексом

2) тут еще смарю как челы эмулируют полигон оффсет...
это хуже офсета по нормали?

#6
17:48, 24 июня 2011

up

#7
21:23, 24 июня 2011

> этот оффсет надо делать када пишу в кубемап как я понял?

угу

> это хуже офсета по нормали?

эм, весь метод на слайдах и был про оффсет по нормали. и разница как раз показывалась с обычным оффсетом. так что да, хуже.

#8
21:51, 24 июня 2011

The Andreyp

ну как там наш специалист ? :)

#9
23:12, 25 июня 2011

)) да какой там специалист

кароч.. я сделал так

1) я делаю нромаль оффсет в лайтпассе а не в пасе рендера в кубемап

float offset=1;        // тут чтото типа умножения на dot(n,l) но я забил
float3 shadowPos=gl_Vertex.xyz+gl_MultiTexCoord0.xyz*offset;

gl_TexCoord[0].xyz = shadowPos-lightPos ; // потом по этому семплица кубе шадовмап 

2) получилось вот что

http://dl.dropbox.com/u/5862637/_R.f.d000.jpg

.........

- Я забил пока на на домножение нормали на n.l - а это важно сделать?
- артефакты показаны красными областями

shadow acne почти исчез но осталось другое
что посоветуете или досоветуете к шадов акнэ тож
...

#10
22:43, 27 июня 2011

А если попробовать генерить грань кубемапы не со стандартной перспективой а напрмер с перспективой liPSM - будет лучше? или тут не прокатит..

#11
5:07, 28 июня 2011

The Andreyp
> делаю нромаль оффсет в лайтпассе а не в пасе рендера в кубемап
Лучше все же делать именно при рендере в кубмапу. По крайней мере некоторые твои артефакты точно исчезли бы.

#12
0:21, 4 июля 2011

ладно вроде разобрался

теперь время блюрить....

я так понял есть сл пути

- просто так заблюрить через оффсет текст координат для кубмапа
- либо взять 3д текстуру которая хранит jitter и по ней блюрить (так по ходу в кризисе ИМХО)

даж ненаю как лучше... и как вычислить для 1 случая dVector с кторым семплить....

во 2 м случае как я понял этот вектор хранится в 3д текстуре.. хз

#13
2:11, 19 июля 2011

пробую пцсс дял кубемапов

смотрю сорс от нвсдк 10

у них там есть код.... есно для 2д шадовмапы

float2 stepUV = searchRegionRadiusUV / BLOCKER_SEARCH_STEP_COUNT;
    for( float x = -BLOCKER_SEARCH_STEP_COUNT; x <= BLOCKER_SEARCH_STEP_COUNT; ++x )
        for( float y = -BLOCKER_SEARCH_STEP_COUNT; y <= BLOCKER_SEARCH_STEP_COUNT; ++y )
        {
            float2 offset = float2( x, y ) * stepUV;
            float shadowMapDepth = tDepthMap.SampleLevel(PointSampler, uv + offset, 0);
        }
   

для кубмапы я дожен это переделать так как я понял


float3 stepUV = searchRegionRadiusUV / BLOCKER_SEARCH_STEP_COUNT;
    for( float x = -BLOCKER_SEARCH_STEP_COUNT; x <= BLOCKER_SEARCH_STEP_COUNT; ++x )
        for( float y = -BLOCKER_SEARCH_STEP_COUNT; y <= BLOCKER_SEARCH_STEP_COUNT; ++y )
        for( float z = -BLOCKER_SEARCH_STEP_COUNT; z <= BLOCKER_SEARCH_STEP_COUNT; ++z )
        {
            float3 offset = float3( x, y,z ) * stepUV;
            float shadowMapDepth = textureCube(Shadow, LightVec+offset).a);
        }

LightVec не нормализован

райт?

#14
3:41, 19 июля 2011

The Andreyp
> райт?
нет.
и что всех тянет делать кубмап тени )) столько гимора с ними. ни в одной нормльной игре не используют, т.к. дорого ))

ладно.
смотри. во-первых, это совсем неправильно из-за того, что вектор LightVec ненормализованный. Поэтому у тебя будет меняться размер области поиска в зависимости от удаления источника света. Этого нам не нужно.
Во-вторых, в 2Д случае сканирование идет в пространстве текстуры, т.е. мы можем спокойно выбрать соседний пиксель. С кубмапой не так все просто. В твоем коде у тебя опять получается блавающий search радиус, который зависит от ориентации кубмапы.

Хотя может нормализация LightVec поможет. Но я сомневаюсь.

Ну и,конечно, 8*8*8 =  512 выборок (минимум) - это жесть.

Страницы: 1 2 313 14 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.