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