2014-09-21 4 views
0

Предположим, у меня есть OpenGL 4x4 Matrix, которую я использую для некоторого преобразования, внутри моего вызова я многократно использую «переводить», но затем, в конце, я хочу «обернуть» этот перевод вокруг определенного размера , поэтому в 2D-терминах предположим, что я переводит X на 210, тогда я хочу обернуть этот перевод в поле шириной «50», что приведет к переводу 10 (210% 50).Wrap OpenGL Matrix translation

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

private float[] mScreenMatrix = { 
     2f/width, 0f, 0f, 0f, 
     0f, -2f/height, 0f, 0f, 
     0f, 0f, 0f, 0f, 
     -1f, 1f, 0f, 1f 
}; 

Итак, если ширина «50» и я называю Matrix.translateM (210,0,0) как я могу «обернуть» эту матрицу, чтобы окончательный перевод на x был всего 10?

ответ

1

Вы не можете (без дополнительной работы), потому что этот обертка вводит модульную арифметику (или тороидальную топологию), которая не соответствует пространству NDC OpenGL (которое грубо переводится в том, который вы видите в окне) выложено. Когда примитив выходит из пространства НДЦ, он получает обрезанный, так что то, что остается, находится в пространстве NDC.

Итак, чтобы получить тороидальную топологию, вы должны дублировать примитивы, которые обрезаются НДЦ, и снова вводить их в противоположный конец НДЦ. Единственные способы сделать это - либо путем явного представления дополнительной геометрии, либо с помощью геометрического шейдера для создания такой геометрии на месте.

+0

спасибо за подробный ответ, я подозревал, что это не будет легко, я постараюсь посмотреть, смогу ли я обойти это каким-то образом, спасибо – FrankMonza

0

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