Проблемы преобразования экранного пространства в пространство клипа

Я рисую графический интерфейс в Direct3D 11, и в настоящее время я управляю им, рисуя множество 3D-квадратов рядом с экраном. Я решил использовать квадраты экрана, чтобы немного улучшить скорость.

Когда я рисую четырехугольник, я предоставляю ему входную позицию (input.pos), которая представляет собой набор координат, определяющих четырехугольник следующим образом:

0,0
0,1
1,0
1,1

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

456,700

И, наконец, я передаю масштаб квадроцикла в пикселях. Таким образом, четырехугольник размером 50x30 пикселей будет иметь следующее значение масштаба:

50,40

Чтобы преобразовать эти координаты в пространство отсечения для моего пиксельного шейдера, я использую следующую математику (которую я намереваюсь в конечном итоге выполнить на ЦП, но пока это делается в вершинном шейдере):

output.pos = float4((input.pos*2* input.instanceScale) / winSize+input.instancePos*2/winSize -1,0.25,1);

В основном это работает, и все отображается рядом со всем остальным, но ось Y перевернута. Это связано с тем, что пространство клипа имеет значение от -1 до 1, но 1 — это верхняя часть экрана в пространстве клипа, что противоречит обычному способу работы. Таким образом, решение должно быть:

output.pos.x = 2*(input.pos.x * input.instanceScale.x + input.instancePos.x)/winSize.x -1;
output.pos.y = 1 - 2*(input.pos.y * input.instanceScale.y + input.instancePos.y)/winSize.y;

Однако, когда я запускаю это, мои квадроциклы просто исчезают. Я предполагаю, что они все еще рендерятся, но где-то за пределами экрана.

Кто-нибудь знает, что может пойти не так?

Кроме того, если я сохраняю новый расчет output.pos.x, но использую старый расчет для координаты y, он все равно работает. Так что проблема должна быть во второй строке этого нового кода.

Большое спасибо

РЕДАКТИРОВАТЬ1: теперь я последовал совету TomMcTwattyPants и зафиксировал окончательную позицию y между 1 и -1. Что происходит, так это то, что элементы графического интерфейса перемещаются вертикально к центру, а также сжимаются. Достигнув центра, они исчезают, а затем зацикливаются.

Перед циклом есть задержка, поэтому я считаю, что между 0 и -1 частью умножения квадроциклы невидимы. Я не уверен, почему, хотя, возможно, порядок вершин изменился, поэтому нормаль теперь указывает в сторону от экрана и отбрасывается? Я попробую отключить отбраковку обратной стороны, чтобы посмотреть, изменит ли это что-нибудь. В любом случае, это не нужно для прохождения GUI.

EDIT2: проблема заключалась в отбраковке задней поверхности. Отключение это все исправило


person Nick Udell    schedule 12.04.2012    source источник


Ответы (2)


Самый простой способ инвертировать ось Y — умножить ее на минус единицу:

output.pos.y *= -1;
person CarlJohnson    schedule 12.04.2012
comment
Я только что попробовал это тоже, и по какой-то причине это все еще не появляется. - person Nick Udell; 12.04.2012
comment
Затем я бы предложил использовать отладчик, чтобы пройтись по коду шейдера и проверить, что значения соответствуют вашим ожиданиям. Если это не помогает (и при условии, что output.pos.y *= 1; работает нормально, за исключением перевернутой оси Y), вы можете попробовать использовать синхронизированный lerp между 1 и -1, чтобы помочь визуализировать проблему. например output.pos.y *= lerp(1,-1, fmod(time_in_seconds,1)); - person CarlJohnson; 13.04.2012
comment
Отличная идея. Я, вероятно, выберу timer lerp, так как PIX по какой-то причине не очень хорошо работает с моим проектом. Я должен что-то показать к концу дня - person Nick Udell; 13.04.2012
comment
Я отредактировал свой исходный пост с новой информацией из LERP. - person Nick Udell; 14.04.2012
comment
Да, проблема заключалась в отбраковке бэкфейса. Я рад отметить ваш ответ как правильный благодаря помощи, которую вы мне оказали. - person Nick Udell; 14.04.2012

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

person TheWanderer    schedule 11.07.2013