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

Xna HLSL 3.0像素着色器限制下的2D光线投射照明问题,xna,hlsl,fragment-shader,raycasting,Xna,Hlsl,Fragment Shader,Raycasting,我一直在使用光线投射为动态照明编写自己的HLSL像素着色器。不幸的是,因为我使用的是XNA以外的版本,所以我最多只能使用ps_3_0。如您所见,3和4之间的限制差异很大,特别是在指令插槽和临时寄存器中: 具体来说,我的指令槽快用完了。这个限制使我无法获得精确的光线。由于像素数量的增加,光线的位置从光源增加,必须比我想要的少很多 给你。 以下是代码的相关部分: //Cast rays (Point Light) float4 CastRays(float2 texCoord: TEXCOORD0)

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

具体来说,我的指令槽快用完了。这个限制使我无法获得精确的光线。由于像素数量的增加,光线的位置从光源增加,必须比我想要的少很多

给你。 以下是代码的相关部分:

//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也相当陌生。我有没有办法在限制和/或增加限制的情况下完成这项工作


谢谢。

您的关卡是动态的还是静态的?对预处理步骤来说,生成有助于增加限制的数据是很有趣的。它们是动态的。很可能每一步都会改变。