Я пытаюсь отобразить сферу как самозванца, но у меня проблема с вычислением значения глубины точек поверхности сферы.
Здесь вы можете увидеть, что происходит, когда я перемещаю камерувокруг сферы самозванца и «реального» куба, который пересекает сферу.
Вы можете видеть, что при перемещении камеры значения глубиныне согласованы, и некоторые части куба, которые должны находиться внутри сферы, в зависимости от положения камеры, входят и выходят из сферы.
Это вершинные и фрагментные шейдеры для сферы-самозванца.
вершинный шейдер :
#version 450 core
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
out vec2 coords;
void main()
{
switch (gl_VertexID)
{
case 0:
coords = vec2(-1.0f, -1.0f);
break;
case 1:
coords = vec2(-1.0f, +1.0f);
break;
case 2:
coords = vec2(+1.0f, -1.0f);
break;
case 3:
coords = vec2(+1.0f, +1.0f);
break;
}
// right & up axes camera space
vec3 right = vec3(view[0][0], view[1][0], view[2][0]);
vec3 up = vec3(view[0][1], view[1][1], view[2][1]);
vec3 center = vec3(0.0f);
float radius = 1.0f;
// vertex position
vec3 position = radius * vec3(coords, 0.0f);
position = right * position.x + up * position.y;
mat4 MVP = projection * view * model;
gl_Position = MVP * vec4(center + position, 1.0f);
}
фрагментный шейдер :
#version 450 core
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
in vec2 coords;
out vec4 pixel;
void main()
{
float d = dot(coords, coords);
if (d > 1.0f)
{
discard;
}
float z = sqrt(1.0f - d);
vec3 normal = vec3(coords, z);
normal = mat3(transpose((view * model))) * normal;
vec3 center = vec3(0.0f);
float radius = 1.0f;
vec3 position = center + radius * normal;
mat4 MVP = projection * view * model;
// gl_DepthRange.diff value is the far value minus the near value
vec4 clipPos = MVP * vec4(position, 1.0f);
float ndcDepth = clipPos.z / clipPos.w;
gl_FragDepth = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far) * 0.5f;
pixel = vec4((normal + 1.0f) * 0.5f, 1.0f);
}
Я следовал этому примеру для вычисления значения глубины.
Матрица модели, которую я передаю шейдерам, является единичной матрицей, поэтому она не влияет на операции.
Большое спасибо за вашу помощь!!