3D спрайты, запись правильной информации о буфере глубины - PullRequest
0 голосов
/ 08 декабря 2011

Я пишу движок частиц для iOS, используя Monotouch и openTK. Мой подход состоит в том, чтобы спроецировать координаты каждой частицы, а затем написать правильно масштабированный текстурированный прямоугольник в этом месте экрана.

работает нормально, но у меня проблемы с вычислением правильного значения глубины, чтобы спрайт корректно перерисовывался и перерисовывался трехмерными объектами в сцене.

Это код, который я использую сегодня:

//d=distance to projection plane
float d=(float)(1.0/(Math.Tan(MathHelper.DegreesToRadians(fovy/2f))));
Vector3 screenPos=Vector3.Transform(ref objPos,ref viewMatrix, out screenPos);
float depth=1-d/-screenPos.Z;

Затем я рисую треугольную полосу по экранной координате, где я помещаю вычисленное выше значение глубины в качестве координаты z.

Результаты почти правильные, но не совсем. Я предполагаю, что мне нужно как-то принять во внимание ближний и дальний отсечения плоскости (ближний 1 и дальний 10000 в моем случае), но я не уверен, как. Я пробовал разные способы и алгоритмы без получения точных результатов.

Буду признателен за помощь.

1 Ответ

1 голос
/ 08 декабря 2011

То, что вы действительно хотите сделать, это взять исходную позицию и передать ее через просмотр модели и проекцию или все, что вы настроили вместо этого, если вы не используете фиксированный конвейер.Предположим, что вы использовали один из стандартных вызовов для установки стека, например glFrustum , и в противном случае оставили вещи идентичными, тогда вы можете получить соответствующую формулу прямо со страницы руководства.Таким образом, читая непосредственно из этого, вы будете преобразовывать как:

z_clip = -( (far + near) / (far - near) ) * z_eye - ( (2 * far * near) / (far - near) )
w_clip = -z

Затем, наконец:

z_device = z_clip / w_clip;

РЕДАКТИРОВАТЬ: поскольку вы работаете в ES 2.0, вы можете избежать этой проблемыполностью.Предоставьте свою геометрию для рендеринга как GL_POINTS и выполните обычное преобразование в вашем вершинном шейдере, но установите gl_PointSize равным размеру в пикселях, который вы хотите, чтобы эта точка была.

В вашем фрагментном шейдере вы можете прочитать gl_PointCoord, чтобы получить координату текстуры для каждого фрагмента, который является частью вашей точки, позволяя вам рисовать точечный спрайт, если вы не хотите использовать только один цвет.

...