2013-09-23 64 views
0

我有以下用于计算景深的计算着色器代码。但是,非常不寻常的是,即使g_rayCount为10,循环也只执行一次。请查看for循环所在的主函数raycastercs。DirectX 11计算着色器5循环

//-------------------------------------------------------------------------------------- 
// 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())); 
    } 
} 

回答

3

在该月底声明

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

当我想你知道删除分号,分号只是运行一个空for循环,然后在括号中的代码此后执行只有一次。

+0

我是盲人。感谢快速hekp人。我只是没有看到。 – Alin

+0

我投了因为它让我发笑 –