As described earlier, the (u, v) texture coordinates that you assign to your vertices
are what determines how the texture fits on your geometry. Often, you will use
texture coordinates that always fall within the range [0, 1], which is
the complete range of the pixels of your texture image. However, it is
also legal to use texture coordinates that go outside this range; you can
have negative values, for instance, or numbers higher than 1.
So if the texture image is only defined over the range [0, 1], what does
the texture look like outside this range? You can specify this with
the texture wrap mode.
texture.setWrapU(wrapMode)
texture.setWrapV(wrapMode)
|
The wrapMode parameter is specified separately for the u and
v directions (there is also a setWrapW() for
3-D textures, but that's an advanced topic). The
wrapMode may be any of the following values:
Texture.WMRepeat | The texture image
repeats to infinity. |
Texture.WMClamp | The last pixel of the
texture image stretches out to infinity. |
Texture.WMBorderColor | The color specified
by texture.setBorderColor() is used to fill the space. |
Texture.WMMirror | The texture image flips
back-and-forth to infinity. |
Texture.WMMirrorOnce | The texture image flips
backwards, once, and then the "border color" is used. |
The default wrap mode is WMRepeat .
Consider the following simple texture image:
We will apply this texture in the center of a large polygon whose
texture coordinates range considerably farther than [0, 1] in both
directions.
WMRepeat
texture.setWrapU(Texture.WMRepeat)
texture.setWrapV(Texture.WMRepeat)
|
WMRepeat mode is often used to tile a relatively small
texture over a large surface.
WMClamp
texture.setWrapU(Texture.WMClamp)
texture.setWrapV(Texture.WMClamp)
|
WMClamp mode is rarely used on large polygons because, frankly, it looks terrible when the pixels stretch out to infinity like this; but this mode is usually the right choice when the texture exactly fills its polygon (see One caution about a common wrap error, below).
WMBorderColor
texture.setWrapU(Texture.WMBorderColor)
texture.setWrapV(Texture.WMBorderColor)
texture.setBorderColor(VBase4(0.4, 0.5, 1, 1))
|
The above blue color was chosen for illustration purposes; you can use
any color you like for the border color. Normally, you would use the background
color of the texture as the border color, like this:
texture.setWrapU(Texture.WMBorderColor)
texture.setWrapV(Texture.WMBorderColor)
texture.setBorderColor(VBase4(1, 1, 1, 1))
|
Some very old graphics drivers don't support
WMBorderColor . In this case, Panda3D will fall back to
WMClamp , which will look similar as long as there is a
sufficient margin of background color around the edge of your texture (unlike our sample texture, which goes all the way out the edge).
WMMirror
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 .
WMMirrorOnce
texture.setWrapU(Texture.WMMirrorOnce)
texture.setWrapV(Texture.WMMirrorOnce)
texture.setBorderColor(VBase4(0.4, 0.5, 1, 1))
|
Few graphics drivers support WMMirrorOnce . In this case,
Panda3D will fall back to WMBorderColor .
Setting different wrap modes
It is possible to set different wrap modes in the u and
v directions:
texture.setWrapU(Texture.WMRepeat)
texture.setWrapV(Texture.WMClamp)
|
One caution about a common wrap mode error
When you apply a texture that is intended to exactly fill a
polygon--that is, the texture coordinates range from 0 to 1, but no
further--you should usually set its wrap mode to clamp. This
is because if you let it keep the default value of repeat, the
color may bleed in from the opposite edge, producing a thin line along
the edge of your polygon, like this:
This is a particularly common error with a texture that is painted as
an alpha cutout, where there is an image with a fully transparent
background: you will often see an thin, barely-visible edge floating
along the top (for instance) of the polygon. This edge is actually
the bottom edge of the texture bleeding onto the top, because the
designer specified WMRepeat instead of
the correct mode, WMClamp .
|