Forward+ problem z implementacja


#1

Witam,
zacząłem implementować do swojego silnika Forward+ i mam pewien problem. Otóż światło punktowe wyświetla mi się tylko na połowie ekranu (tak jakby tylko połowa grup roboczych dla jednego tile wiedziała, że to światło powinno tam być). Wydaje mi się, że problem leży gdzieś w: albo obliczaniu frustuma, albo przekształcaniu głębokości z depth mapy albo w testowaniu świateł z frustumem. Niestety, szukałem, ale błędu znaleźć nie mogę…

EDIT: Trochę przejrzałem ten kod i problem leży na pewno w obliczaniu frustum dla danej grupy, a dokładnie gdzieś tutaj:

if(gl_LocalInvocationIndex == 0)
{
o_lightCount = 0;
s_groupStartIndex = (gl_WorkGroupID.x + gl_WorkGroupID.y * workingGroups.x) * MAX_VIS_LIGHTSX;

  vec2 tmp_screenSpace[4];
  //Top left
  tmp_screenSpace[0] = vec2(TILE_SIZE * gl_WorkGroupID.x, TILE_SIZE * gl_WorkGroupID.y);
  //Bottom left
  tmp_screenSpace[1] = vec2(TILE_SIZE * gl_WorkGroupID.x, TILE_SIZE * (gl_WorkGroupID.y + 1));
  //Bottom right
  tmp_screenSpace[2] = vec2(TILE_SIZE * (gl_WorkGroupID.x + 1), TILE_SIZE * (gl_WorkGroupID.y + 1));
  //Top right
  tmp_screenSpace[3] = vec2(TILE_SIZE * (gl_WorkGroupID.x + 1), TILE_SIZE * gl_WorkGroupID.y);
  
  //Clip space frustum
  vec2 tmp_clipSpace[4];
  for(int i = 0; i < 4; i++)
  {
  	tmp_clipSpace[i] = vec2((tmp_screenSpace[i].x / u_screenSize.x) * 2.0f - 1.0f,
  							((tmp_screenSpace[i].y) / u_screenSize.y) * 2.0f - 1.0f);
  }
  
  //View space frustum
  vec4 tmp_viewSpace[4];
  for(int i = 0; i < 4; i++)
  {
  	tmp_viewSpace[i] = convertProjToView(vec4(tmp_clipSpace[i], 1.0, 1.0), u_invProjMatrix);
  }
  
  s_groupFrustum[0] = createPlaneEqn(tmp_viewSpace[3].xyz, tmp_viewSpace[0].xyz);
  s_groupFrustum[1] = createPlaneEqn(tmp_viewSpace[0].xyz, tmp_viewSpace[1].xyz);
  s_groupFrustum[2] = createPlaneEqn(tmp_viewSpace[1].xyz, tmp_viewSpace[2].xyz);
  s_groupFrustum[3] = createPlaneEqn(tmp_viewSpace[2].xyz, tmp_viewSpace[3].xyz);

}

Jeszcze dodam te metody wyżej:

//From AMD DX11 sample.
//this creates the standard Hessian-normal-form plane equation from three points,
//except it is simplified for the case where the first point is the origin
vec3 createPlaneEqn(vec3 tmp_b, vec3 tmp_c)
{
//normalize(cross( b-a, c-a )), except we know “a” is the origin
//also, typically there would be a fourth term of the plane equation,
//-(n dot a), except we know “a” is the origin
return normalize(cross(tmp_b, tmp_c));
}

//Convert a point from post-projection space into view space
vec4 convertProjToView(vec4 tmp_p, mat4 tmp_invProjMatrix)
{
tmp_p = tmp_invProjMatrix * tmp_p;
tmp_p /= tmp_p.w;
return tmp_p;
}

Niby kod prosty, który ma na celu przetworzyć punkty ekranowe na punkty w view spacie, ale gdzieś tutaj jes bug :confused:
Będę wdzięczny za wszelką pomoc jak ktoś ma pomysł :slight_smile:


#2

Edytowałem pierwszy post bo już wiem gdzie dokładnie jest błąd, ale rozwiązania nadal brak :confused:


#3

mnie sie zdaje ze do zrobienia planes dla frustum “tile”'a to potrzebujesz pelnej kolumny viewProj matrix czyli 4 component vector.

Ja mam tak extrakcje frustum planes z matrix’a ustawione w C++

potrzeba pelne row vectory (4 comp nie 3)

chyba sie nadziales na to ze DX11 matrixy ma row-first a nie column-first jak GLSL.


#4

Ah i nie patrz na near i far plane extraction w moim silniku bo ustawilem sobie reverse-Z plus 0,1 depth range zeby sie zgadzac z vulkanem