После многих попыток я нашел лучший ответ в sqlite docs для перечисления метаданных для таблицы, даже прикрепленных баз данных.
meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
print r
Ключевой информацией является префикс table_info, а не my_table с именем дескриптора вложения.
Вы путаете мел и сыр. PositionCS
является позицией пространства клипа и может быть преобразована в нормализованную позицию пространства устройства с помощью Перспективного деления :
vec2 ndcPos = PositionCS.xyz / PositionCS.w;
sampledDepth
является значением глубины (которое по умолчанию в диапазоне [0, 1]) и может быть получен путем считывания "красного" цветового канала (.r
, .x
) из текстуры буфера глубины. Глубина может быть преобразована в нормализованную координату Z пространства устройства с помощью depth*2.0-1.0
:
vec2 texCoord = ndcPos.xy * 0.5 + 0.5;
// (+ 0.5/resolution.xy;) is not necessary if texture filter is GL_NEAREST
float sampledDepth = texture(gDepth, texCoord).x;
float sampleNdcZ = sampledDepth * 2.0 - 1.0;
. В перспективной проекции и в нормализованном пространстве устройства все точки с одинаковыми координатами x и y находятся на одном луче, который начинается с позиции просмотра.
Это означает, что буфер глубины gDepth
был создан с той же матрицей вида и матрицей проекции, что и ndcPos
(PositionCS
), Вы можете заменить ndcPos.z
соответствующей z-координатой NDC из буфера глубины (sampleNdcZ
), и точка все еще находится на том же луче обзора.
ndcPos.z
и sampleNdcZ
являются сравниваемыми значениями в одной и той же системе отсчета.
vec3 ndcSample = vec3(ndcPos.xy, sampleNdcZ);
Эта координата может быть преобразована в координату пространства обзора с помощью матрицы обратной проекции и деления перспективы.
Если точки NDC на одном луче обзора преобразуются в пространство обзора, то координаты XY будут другими. Обратите внимание, что преобразование не является линейным из-за (* 1/.w
). См. Также OpenGL - координаты мыши для координат пространства .
uniform mat4 invProj; // = inverse(projection)
vec4 hViewPos = invProj * vec4(ndcSample, 1.0);
vec3 viewPosition = hViewPos.xyz / hViewPos.w;
Это может быть дополнительно преобразовано с помощью матрицы обратного обзора в мировое пространство и матрицы обратной модели в пространство объектов:
vec3 WorldPos = (invView * vec4(viewPosition, 1.0)).xyz;
vec3 objectPosition = (invModel * vec4(WorldPos, 1.0)).xyz;