2013-09-23 123 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

我投了因爲它讓我發笑 –