нет. а вобще ты на каком апи делаешь?
у меня:
matAll = objMat*matView*matProj;
matWorld = objMat;
matLight =light_matView*light_matProj;
я не пойму че за LightOrthoMatrix, и почему она участвует в matAll, т.к. matAll-это для рендера сцены.
при чем заметим что матрицы разные в разных шейдерах, так что не понятно это ты к какому шейдеру.
Не то написал:
matLight = LightViewProjMatrix = LightProjMatrix* LightViewMatrix LightOrthoMatrix = LightProjMatrix
Делаю на openGL
LightOrthoMatrix должен участвовать в matAll при рендере глубины из источника света
но не должен участвовать в matAll для сцены. для этого туда сунется matLight и matWorld чтобы работать суто с текстурными координатами.
Кирюха
> Делаю на openGL
GLSL?
Аврелий
> GLSL?
Да
GLSL Example в студию =)
Или HLSL Example в конечном виде... Дабы адаптировать в GLSL корректно
мои шейдеры непридатны если что. т.к. у меня убершейдеры с ветвлением, и занимают несколько десятков страниц.
Тогда ссылку на простейшие шмапы HLSL, к которым это хозяйство можно применить =) (с HLSL не дружил, но вроде бы есть разницы в представлении матриц)
google.com
Спс, глаза открыл, теперь всегда буду пользоваться этим сайтом =) (на самом деле хотелось видеть именно подобие твоего кода =)) ну да ладно...
Таки доделал тени. Как оказалось ошибка была банальная. За место smcd.x*=0.5; smcd.y=-smcd.y*0.5; надо было написать smcd.x=0.5+0.5; smcd.y=smcd.y*0.5+0.5;
Вот код шейдеров если кому интересно:
Рендер шадоу мапы
#version 120 uniform mat4 viewprojMatrix; uniform mat4 modelMatrix; varying vec4 pos; void main(void) { pos = viewprojMatrix * modelMatrix * vec4(gl_Vertex.xyz, 1.0); 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); }
Наложение теней
#version 120 uniform mat4 viewprojMatrix; uniform mat4 modelMatrix; varying vec3 smc; void main(void) { vec4 lpos = viewprojMatrix * modelMatrix * gl_Vertex; lpos.x=lpos.x/(abs(lpos.x)+1.0); lpos.y=lpos.y/(abs(lpos.y)+1.0); smc.x = lpos.x*0.5+0.5; smc.y = lpos.y*0.5+0.5; smc.z = lpos.z*0.5+0.5 - 0.0001; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } #version 120 uniform sampler2D shadowMap; varying vec3 smc; void main (void) { float shadow = float( smc.z <= texture2D(shadowMap,smc.xy).x); gl_FragColor = vec4(vec3(1.0) * shadow , 1.0); }
Кирюха
> smcd.x=0.5+0.5
извини, но это бред. уверен что с этим работает нормально?
Да, все отлично работает.
Кирюха
> smcd.x=0.5+0.5
Очепятка? В шейдере-то smc.x = lpos.x*0.5+0.5;
Тема в архиве.