游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1839|回复: 2

帮忙读一段D3D程序

[复制链接]

13

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2005-5-18 16:38:00 | 显示全部楼层 |阅读模式
这段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;
sf_2005518163839.jpg

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2005-5-18 18:29:00 | 显示全部楼层

Re:帮忙读一段D3D程序

这就是取十个采样点,然后平均作一个过滤

7

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
QQ
发表于 2005-5-25 15:28:00 | 显示全部楼层

Re:帮忙读一段D3D程序

能不能将整个代码共享一下?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 18:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表