|
|
这段VS指令的作用是产生软阴影,即在阴影边界产生个过渡带。是我下载的代码,有点看不懂,请大家帮忙看一下,主要是看看怎样用那个offsets[]数组产生软阴影的,也就是这个数组的具体作用。我没看明白for循环里float4 sample = tex2D(Shadow, coord + r * offsets);这里采样得到的是shadow纹理里什么位置上的点。
代码如下:
[Vertex shader]
float4x4 mvp;
float3 lightPos;
float3 camPos;
float invWidth, invHeight;
struct VS_OUTPUT {
float4 Pos: POSITION;
float2 texCoord: TEXCOORD0;
float3 lightVec: TEXCOORD1;
float3 viewVec: TEXCOORD2;
float3 shadowCoord: TEXCOORD3;
};
VS_OUTPUT main(float4 pos: POSITION, float2 texCoord: TEXCOORD0, float3 tangent: TEXCOORD1, float3 binormal: TEXCOORD2, float3 normal: TEXCOORD3){
VS_OUTPUT Out;
float4 sPos = mul(mvp, pos);
Out.Pos = sPos;
Out.texCoord = texCoord;
float3 lightVec = INV_LIGHT_RANGE * (lightPos - pos);
Out.lightVec.x = dot(lightVec, tangent);
Out.lightVec.y = dot(lightVec, binormal);
Out.lightVec.z = dot(lightVec, normal);
Out.viewVec = (camPos - pos) / 50;
Out.shadowCoord.x = sPos.z + sPos.x + sPos.z * invWidth;
Out.shadowCoord.y = sPos.z - sPos.y + sPos.z * invHeight;
Out.shadowCoord.z = 2 * sPos.z;
return Out;
}
[Fragment shader]
sampler Base;
sampler Bump;
sampler Shadow;
float4 offsets[10];
float4 lightColor;
#define DIFF_TOLERANCE 0.0005
float4 main(float2 texCoord: TEXCOORD0_centroid, float3 lightVec: TEXCOORD1, float3 viewVec: TEXCOORD2, float3 shadowCoord: TEXCOORD3) : COLOR {
float r = dot(lightVec, lightVec) / length(viewVec); //r赋初值
float2 coord = shadowCoord.xy / shadowCoord.z; //coord赋初值
float4 sum = tex2D(Shadow, coord);
sum.xy *= DIFF_TOLERANCE;
for (int i = 0; i < 10; i++){
float4 sample = tex2D(Shadow, coord + r * offsets);
//主要是这里搞不明白,offsets[]的作用!
float diff = sum.w - sample.w;
diff = saturate(DIFF_TOLERANCE - diff * diff);
sum.xy += diff * sample.xy;
}
float shadow = sum.x / sum.y;
float atten = saturate(1 - dot(lightVec, lightVec));
lightVec = normalize(lightVec);
float4 base = tex2D(Base, texCoord);
float3 bump = tex2D(Bump, texCoord) * 2 - 1;
float diffuse = saturate(dot(lightVec, bump));
return shadow * diffuse * atten * lightColor * base;
}
//结束!!!!!!!!!!!!!
其中offsets[]的定义为:
static vec4 offsets[] = {
vec4( 0.8f, -1.0f, 0.0f, 0.0f), // . . . . . | . . . X .
vec4(-0.2f, -0.8f, 0.0f, 0.0f), // . . . . X | . . . . .
vec4( 0.2f, -0.6f, 0.0f, 0.0f), // . . . . . | X . . . .
vec4( 1.0f, -0.4f, 0.0f, 0.0f), // . . . . . | . . . . X
vec4(-0.6f, -0.2f, 0.0f, 0.0f), // . . X . . | . . . . .
// ----------X----------
vec4( 0.6f, 0.2f, 0.0f, 0.0f), // . . . . . | . . X . .
vec4(-1.0f, 0.4f, 0.0f, 0.0f), // X . . . . | . . . . .
vec4( 0.4f, 0.6f, 0.0f, 0.0f), // . . . . . | . X . . .
vec4(-0.4f, 0.8f, 0.0f, 0.0f), // . . . X . | . . . . .
vec4(-0.8f, 1.0f, 0.0f, 0.0f), // . X . . . | . . . . .
};
mvp定义为:
projection = projectionMatrixX(1.5f, float(height) / float(width), 1, 6000);
modelView = rotateZXY(-wx, -wy, -wz);
mat4 mvp = projection * modelView;
|
-
|