(u,v) координаты текстур назначенные вершинам определяют как текстура будет накоадываться на геометрию. Обычно вы будете использовать координаты в промежутке [0,1], который представляет собой все пиксели вашей картинки. Однако, можно так же использовать координаты текстур выходящие за этот промежуток и даже отрицательные значения.
Итак что будет происходить с текстурой если мы выйдем за промежуток [0,1], за картинку? Вы можете задать это с помощью режимов наложения текстур.
Code
texture.setWrapU(wrapMode)
texture.setWrapV(wrapMode)
Параметр wrapMode определяется отдельно для направлений u и v (есть также setWrapW() для 3-D текстур). Параметр wrapMode может принимать следующие значения:
Texture.WMRepeat Картинка текстуры повторяется до бесконечности.
Texture.WMClamp Последний (крайний) пиксель картинки текстуры растягивается до бесконечности.
Texture.WMBorderColor Цвет определенный с помощью texture.setBorderColor() заполнить пустое пространство.
Texture.WMMirror Картинка текстуры зеркально отражается туда обратно до бесконечности.
Texture.WMMirrorOnce Картинка отражается один раз, а потом используется BorderColor.
Режимы наложения по умолчанию - WMRepeat.
Возмем следующую простую картинку для примера:
Поместим эту текстуру в центр большого полигона с координатами текстуры выходящими за [0,1] в обоих направлениях.
WMRepeat
Code
texture.setWrapU(Texture.WMRepeat)
texture.setWrapV(Texture.WMRepeat)
Режим WMRepeat часто используется, чтобы затайлить (закрасить) большую поверхность маленькой текстурой.
WMClamp
Code
texture.setWrapU(Texture.WMClamp)
texture.setWrapV(Texture.WMClamp)
Режим WMClamp редко используется на больших полигонах, потому что, честно говоря, выглядит это ужасно. Но этот режим обычно хороший выбор когда текстура четко заполняет полигон (см. предупреждение об ошибке при использовании обычного режима наложения внизу статьи).
WMBorderColor
Code
texture.setWrapU(Texture.WMBorderColor)
texture.setWrapV(Texture.WMBorderColor)
texture.setBorderColor(VBase4(0.4, 0.5, 1, 1))
Синий цвет был выбран с целью иллюстрации. Вы можете использовать любой цвет. Обычно используют фоновый цвет текстуры:
Code
texture.setWrapU(Texture.WMBorderColor)
texture.setWrapV(Texture.WMBorderColor)
texture.setBorderColor(VBase4(1, 1, 1, 1))
Некоторые очень старые графические драйвера не поддерживают WMBorderColor. В таких случаях Panda3D будет использовать WMClamp, который даст тот же эффект если по краю картинки будет рамка одного нужного нам цвета.
WMMirror
Code
texture.setWrapU(Texture.WMMirror)
texture.setWrapV(Texture.WMMirror)
Many older graphics drivers do not support WMMirror. In this case, Panda3D will fall back to WMRepeat.
Многие старые графические драйвера не поддерживают WMMirror. В таком случае Panda3D будет использовать WMRepeat.
WMMirrorOnce
Code
texture.setWrapU(Texture.WMMirrorOnce)
texture.setWrapV(Texture.WMMirrorOnce)
texture.setBorderColor(VBase4(0.4, 0.5, 1, 1))
Некоторые графические драйвера не поддерживают WMMirrorOnce. В таком случае Panda3D будет использовать WMBorderColor.
Установка различных режимов наложения
Есть возможность установить разные режимы наложения текстур для направлений u и v:
Code
texture.setWrapU(Texture.WMRepeat)
texture.setWrapV(Texture.WMClamp)
Предупреждение об ошибке при использовании обычного режима наложения
Когда вы накладываете текстуру, которая должна четко заполнять полигон, т.е. ее координаты четко входят в промежуток [0,1] и не больше, вам обычно стоит использовать режим WMClamp. Если этого не сделать и использовать WMRepeat по умолчанию, то по краю может проявиться кусок от противоположного края картинки и получится тонкая полоска. Пример: