我一直在使用光线投射为动态照明编写自己的HLSL像素着色器。不幸的是,由于我使用的是XNA,我最多只能使用ps_3_0
。如您所见,3和4之间的限制差别很大,特别是在指令槽和临时寄存器中:
具体来说,我的指令用完了。这种限制使我无法获得准确的光线。 (如同光线的位置从光源增加的像素数量必须比我想要的少很多)
这是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来说还是一个新手。有什么方法可以让我的工作在限制和/或增加限制之下吗?
谢谢。