OpenGL: ShadowMapping: тени видны только при y = 0 - PullRequest
3 голосов
/ 29 апреля 2009

Я реализовал отображение теней с помощью FBO и GLSL. он используется на высоте. то есть некоторые объекты (деревья, растения, ...) отбрасывают тени на поле высоты.

У меня проблема в том, что тени видны только на земле поля высоты. то есть, где высота поля высоты = 0. Как только будет достигнута некоторая высота, тени исчезнут. если я смотрю на карту теней, все выглядит хорошо ... объекты, которые находятся ближе к свету, темнее.

вот мой вершинный шейдер GLSL:

uniform mat4 lightView, lightProjection;

const mat4 biasMatrix = mat4(   0.5, 0.0, 0.0, 0.0,
                            0.0, 0.5, 0.0, 0.0,
                            0.0, 0.0, 0.5, 0.0,
                            0.5, 0.5, 0.5, 1.0);        //bias from [-1, 1] to [0, 1]

void main()
{   
gl_Position = ftransform(); 

mat4 shadowMatrix = biasMatrix * lightProjection * lightView;
shadowTexCoord = shadowMatrix * gl_Vertex;    
}

fragmentshader:

uniform sampler2DShadow shadowmap;
varying vec4 shadowTexCoord;

void main() 
{    
vec4 shadow = shadow2DProj(shadowmap, shadowTexCoord, 0.0);
float colorshadow = shadow.r < 0.1 ? 0.5 : 1.0;

vec4 color = vec4(1,1,1,1); 

gl_FragColor = vec4( color*colorshadow, color.w );  

}

Большое спасибо за любую помощь в этом!

Ответы [ 2 ]

2 голосов
/ 08 мая 2009

Я думаю, что здесь может быть некоторая путаница между различными пространствами. Как написано, похоже, ваш код будет работать, только если gl_ModelViewMatrix для земли содержит только преобразования камеры. Это потому, что ftransform в основном идет

gl_Position = gl_ProjectionMatrix * (gl_ModelViewMatrix * gl_Vertex)

это означает, что gl_Vertex указано в координатах объекта. Однако, как правило, матрица вида карты освещения от мировых координат к пространству обзора источника света, так что этот код будет работать, только если объектное пространство = мировое пространство. Итак, в основном, скажем, вы масштабируете местность, ну тогда пространство объектов больше не равно мировому пространству. Из-за этого вам нужно разделить gl_ModelViewMatrix на две части: матрицу вида камеры и преобразование моделирования (например, объект -> мировое пространство)

Я не проверял этот код, но я бы попробовал что-то вроде этого:

uniform mat4 lightView, lightProjection;
uniform mat4 camView, camProj, modelTrans;
const mat4 biasMatrix = mat4(   0.5, 0.0, 0.0, 0.0,
                                                        0.0, 0.5, 0.0, 0.0,
                                                        0.0, 0.0, 0.5, 0.0,
                                                        0.5, 0.5, 0.5, 1.0);        //bias from [-1, 1] to [0, 1]

void main()
{
mat4 modelViewProjMatrix =  camProj * camView * modelTrans;  
gl_Position =  modelViewProjMatrix * gl_Vertex;   

mat4 shadowMatrix = biasMatrix * lightProjection * lightView * modelTrans;
shadowTexCoord = shadowMatrix * gl_Vertex;    
}

Технически это быстрее умножать матрицы на процессоре и передавать только те, которые вам нужны, но для того, чтобы что-то работало, иногда так проще сделать.

0 голосов
/ 06 мая 2009

Может быть, вы просто пропустили копирование, но я не вижу, что shadowTexCoord изменяется в вершинном шейдере. Это должно привести к ошибке компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...