0

被写界深度を計算するための次の計算シェーダー コードがあります。ただし、非常にまれに、g_rayCount が 10 であっても、ループは 1 回だけ実行されます。 for ループがあるメイン関数 raycastercs を見てください。

//--------------------------------------------------------------------------------------
// Compute Shader
//-------------------------------------------------------------------------------------

SamplerState SSLinear
{
    Filter = Min_Mag_Linear_Mip_Point;
    AddressU = Border;
    AddressV = Border;
    AddressW = Border;
};

float3 CalculateDoF(uint seedIndex, uint2 fragPos)
{
    ;
}

[numthreads(RAYCASTER_THREAD_BLOCK_SIZE, RAYCASTER_THREAD_BLOCK_SIZE, 1)]
void RaycasterCS(in uint3 threadID: SV_GroupThreadID, in uint3 groupID: SV_GroupID, in uint3 dispatchThreadID :SV_DispatchThreadID)
{
    uint2 fragPos   = groupID.xy * RAYCASTER_THREAD_BLOCK_SIZE + threadID.xy;
    float4 dstColor = g_texFinal[fragPos];
    uint seedIndex  = dispatchThreadID.x * dispatchThreadID.y;


    float3 final = float3(0, 0, 0);
    float color = 0;

    [loop][allow_uav_condition]
    for (int i = 0; i < g_rayCount; ++i);
    {
        float3 dof = CalculateDoF(seedIndex, fragPos);
        final += dof;
    }

    final *= 1.0f / ((float) g_rayCount);
    g_texFinalRW[fragPos] = float4(final, 1);
}


//--------------------------------------------------------------------------------------


technique10 Raycaster
{
    pass RaycastDefault
    {
        SetVertexShader(NULL);
        SetGeometryShader(NULL);
        SetPixelShader(NULL);
        SetComputeShader(CompileShader(cs_5_0, RaycasterCS()));
    }
}
4

1 に答える 1

4

for ステートメントの末尾にあるセミコロンを削除します

for (int i = 0; i < g_rayCount; ++i)  // removed semicolon
{
    float3 dof = CalculateDoF(seedIndex, fragPos);
    final += dof;
}

ご存じのとおり、セミコロンは空のforループを実行しているだけで、中かっこ内のコードはその後 1 回だけ実行されました。

于 2013-09-23T08:44:43.923 に答える