|
|
最近想用soft_edged介绍的方法做软阴影,首先我实现了深度图的拷贝,在用glsl实现PCF的shadowmap时,只能得到最后画的一个物体,不仅没有阴影,连物体色彩也没有,并且场景是黑色的
下面是我的GLSL代码:
..vertex shader
niform mat4 texturematrix;
varying vec4 projcood;
uniform vec4 lightpos;
varying float diffuse ;
void main()
{
projcood=texturematrix*gl_Vertex;
vec4 pos = gl_ModelViewMatrix * gl_Vertex;
vec3 n = gl_NormalMatrix * gl_Normal;
vec3 lightvect = normalize(lightpos.xyz - pos.xyz);
diffuse= max(dot(lightvect,n ), 0.0);
gl_Position =ftransform();
}
//frgment shader
uniform sampler2DShadow shadowmap;
varying vec4 projcood;
uniform float size;
uniform vec4 lightcolor;
varying float diffuse ;
uniform vec4 ambient;
void main()
{
vec4 vtexcoord[9];
float shadowcolor[9];
float texsize=1.0/size;
vec4 color;
float factorshadow;
vec4 xolor;
vec4 projcood1;
//4 3 5
//1 0 2
//7 6 8
// projcood1=projcood/projcood.w;
vtexcoord[0]=projcood;
vtexcoord[1]=projcood+vec4(-texsize,0.0,0.0,0.0);
vtexcoord[2]=projcood+vec4(texsize,0.0,0.0,0.0);
vtexcoord[3]=projcood+vec4(0.0,-texsize,0.0,0.0);
vtexcoord[6]=projcood+vec4(0.0,texsize,0.0,0.0);
vtexcoord[4]=projcood+vec4(-texsize,-texsize,0.0,0.0);
vtexcoord[7]=projcood+vec4(-texsize,texsize,0.0,0.0);
vtexcoord[5]=projcood+vec4(texsize,-texsize,0.0,0.0);
vtexcoord[8]=projcood+vec4(texsize,texsize,0.0,0.0);
if(projcood.q< 0.0)
{
factorshadow=1.0;
}
else
{
for(int i=0;i<9;i++ )
{
shadowcolor=shadow2DProj(shadowmap, vtexcoord).r;
factorshadow=factorshadow+shadowcolor;
}
factorshadow=factorshadow/9.0;
// xolor=vec4(0.2,0.6,1.0,1.0);
}
//gl_FragColor=xolor;
gl_FragColor=factorshadow*lightcolor*diffuse+ambient;
}
|
|