2015-11-06 28 views
0

我試圖通過獲得屏幕空間座標然後使用交叉產品來獲得視錐體平面來計算每個平鋪截錐體。然而,當我檢查哪些瓷磚受光線影響時,它們的方向相反,如同它們正朝着相機的相反方向移動,以及在它後面。我試過改變交叉產品訂單,但它似乎沒有工作。下面是生成視錐和檢查,如果光與它的代碼:平鋪的陰影平截體被顛倒

//Start by getting the corners in screen space 
uint minX = MAX_WORK_GROUP_SIZE * gl_WorkGroupID.x; 
uint minY = MAX_WORK_GROUP_SIZE * gl_WorkGroupID.y; 
uint maxX = MAX_WORK_GROUP_SIZE * (gl_WorkGroupID.x + 1); 
uint maxY = MAX_WORK_GROUP_SIZE * (gl_WorkGroupID.y + 1); 

//Convert these corners into NDC and then convert them to view space 
vec4 tileCorners[4]; 
tileCorners[0] = unProject(vec4((float(minX)/SCREEN_WIDTH) * 2.0f - 1.0f, (float(minY)/SCREEN_HEIGHT) * 2.0f - 1.0f, 1.0f, 1.0f)); 
tileCorners[1] = unProject(vec4((float(maxX)/SCREEN_WIDTH) * 2.0f - 1.0f, (float(minY)/SCREEN_HEIGHT) * 2.0f - 1.0f, 1.0f, 1.0f)); 
tileCorners[2] = unProject(vec4((float(maxX)/SCREEN_WIDTH) * 2.0f - 1.0f, (float(maxY)/SCREEN_HEIGHT) * 2.0f - 1.0f, 1.0f, 1.0f)); 
tileCorners[3] = unProject(vec4((float(minX)/SCREEN_WIDTH) * 2.0f - 1.0f, (float(maxY)/SCREEN_HEIGHT) * 2.0f - 1.0f, 1.0f, 1.0f)); 

//Create the frustum planes by using the cross product between these points 
frustum[0] = CreatePlane(tileCorners[0], tileCorners[1]); //bot 
frustum[1] = CreatePlane(tileCorners[1], tileCorners[2]); //right 
frustum[2] = CreatePlane(tileCorners[2], tileCorners[3]); //top 
frustum[3] = CreatePlane(tileCorners[3], tileCorners[0]); //left 

和功能:

vec4 unProject(vec4 v) 
{ 
    v = inverseProjectionMatrix * v; 
    v /= v.w; 
    return v; 
} 
vec4 CreatePlane(vec4 b, vec4 c) 
{ 
    vec4 normal; 
    normal.xyz = normalize(cross(b.xyz, c.xyz)); 
    normal.w = 0; 
    return normal; 
} 

float GetSignedDistanceFromPlane(vec4 p, vec4 eqn) 
{ 
    return dot(eqn.xyz, p.xyz); 
} 

我該如何檢查燈

int threadsPerTile = MAX_WORK_GROUP_SIZE*MAX_WORK_GROUP_SIZE; 
for (uint i = 0; i < NUM_OF_LIGHTS; i+= threadsPerTile) 
{ 
    uint il = gl_LocalInvocationIndex + i; 


    if (il < NUM_OF_LIGHTS) 
    { 
     PointLight p = pointLights[il]; 

     vec4 viewPos = viewMatrix * vec4(p.position.xyz, 1.0f); 
     float r = p.radius; 

    //  if (viewPos.z + minDepthZ < r && viewPos.z - maxDepthZ < r) 
//  { 

     if((GetSignedDistanceFromPlane(viewPos, frustum[0]) < r) && 
      (GetSignedDistanceFromPlane(viewPos, frustum[1]) < r) && 
      (GetSignedDistanceFromPlane(viewPos, frustum[2]) < r) && 
      (GetSignedDistanceFromPlane(viewPos, frustum[3]) < r)) 

      { 
       uint id = atomicAdd(pointLightCount, 1); 
       pointLightIndex[id] = il; 
      } 
    //  } 

    } 
} 

我評論out的z部分只是爲了調試。這些圓錐體完全顛倒了,或者我在做一些非常錯誤的事情,在這張照片中,我正在向後看,所以瓷磚受到影響,它們與場景的完全相反方向,當我移動相機時瓷磚移動在相反的方向以及

enter image description here

回答

1

顯然視錐計算正確,但一些關於ARB擴展(我認爲是不相關的)使一切發生爆炸。我用

#extension GL_ARB_compute_variable_group_size : enable 
layout(local_size_variable) in; 

沒有工作在所有的,所以我只是把它改爲

layout(local_size_x = MAX_WORK_GROUP_SIZE, local_size_y = MAX_WORK_GROUP_SIZE) in; 

和CPU上:

glDispatchCompute((1280/16), (720/16), 1); 
    //glDispatchComputeGroupSizeARB((1280/16), (720/16), 1, 16, 16, 1); 

的正常工作,所以我想有什麼東西關於不正確初始化工作線程數量的ARB方法