2013-09-23 2 views
0

필자는 피사계 심도 계산을위한 다음과 같은 계산 쉐이더 코드를 가지고 있습니다. 그러나 매우 비정상적으로 g_rayCount가 10 일지라도 루프는 한 번만 실행됩니다. for 루프가있는 주요 함수 raycastercs를 살펴보십시오.DirectX 11 Compute Shader 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

내가 웃기 때문에 투표했습니다. –