在HLSL 3.0像素着色器的限制下,2D光线投射照明的问题

时间:2015-06-30 18:15:04

标签: xna hlsl fragment-shader raycasting

我一直在使用光线投射为动态照明编写自己的HLSL像素着色器。不幸的是,由于我使用的是XNA,我最多只能使用ps_3_0。如您所见,3和4之间的限制差别很大,特别是在指令槽和临时寄存器中:

enter image description here

具体来说,我的指令用完了。这种限制使我无法获得准确的光线。 (如同光线的位置从光源增加的像素数量必须比我想要的少很多)

这是what it looks like。 这是代码的相关部分:

//Cast rays (Point Light)
float4 CastRays(float2 texCoord: TEXCOORD0) : COLOR0
{
    float dir;
    float2 move;
    float2 rayPos;

    float2 pixelPos = float2(texCoord.x * width, texCoord.y * height);

    float dist = distance(pixelPos, lightPos);

    if (sqrt(dist) <= lightSize)
    {
        rayPos = lightPos;
        dir = atan2(lightPos.y - pixelPos.y, lightPos.x - pixelPos.x);
        move = float2(cos(dir), sin(dir)) * rayLength;
        for (int ii = 0; ii < clamp(dist / rayLength, 0, 7); ii++)
        {
            if (tex2D(s0, float2(rayPos.x / width, rayPos.y / height)).a > 0)
            {
                return black;
            }
            rayPos -= move;
        }
    }
    else
    return black;

    float light = 1 - clamp((float)abs(sqrt(dist)) / lightSize, 0.0, 1.0);
    return lightColor * light;
}

我设置的限制变量是rayLength。这个数字越大,光线就越不准确。如果有人想要,我可以给出更具体的例子。

我对光线投射的概念很陌生,对HLSL来说还是一个新手。有什么方法可以让我的工作在限制和/或增加限制之下吗?

谢谢。

0 个答案:

没有答案