我有一个程序,用户可以在其中创建不同宽度和高度的框。
我还有一个纹理(512 x 512像素),它应该放在每个盒子上。
现在我遇到的问题是在90x90 Box(Mesh.Box
)上我可以将纹理放置4x4次。
所以我认为我可以使用4/90的比例来对盒子进行纹理化。但这不起作用
该方框的宽度为28.723,高度为56.43661
我使用以下代码计算纹理坐标:
float tex_coords_w = 4.0f / 90;
float tex_coords_h = 4.0f / 90;
mesh = Mesh.Box(d3dDevice, width, height, 0);
Mesh tempMesh = mesh.Clone(mesh.Options.Value, VertexFormats.PositionNormal | VertexFormats.Texture1, d3dDevice);
CustomVertex.PositionNormalTextured[] vertData = (CustomVertex.PositionNormalTextured[])tempMesh.VertexBuffer.Lock(0, typeof(CustomVertex.PositionNormalTextured), LockFlags.None, tempMesh.NumberVertices);
for (int i = vertData.Length / 2; i < vertData.Length; i += 4)
{
vertData[i + 1].Tu = Convert.ToSingle(i) + 0.0f;
vertData[i + 1].Tv = Convert.ToSingle(i) + 0.0f;
vertData[i + 2].Tu = Convert.ToSingle(i) + tex_coords_w * width;
vertData[i + 2].Tv = Convert.ToSingle(i) + 0.0f;
vertData[i + 3].Tu = Convert.ToSingle(i) + tex_coords_w * width;
vertData[i + 3].Tv = Convert.ToSingle(i) + tex_coords_h * height;
vertData[i + 0].Tu = Convert.ToSingle(i) + 0.0f;
vertData[i + 0].Tv = Convert.ToSingle(i) + tex_coords_h * height;
}
tempMesh.VertexBuffer.Unlock();
mesh.Dispose();
mesh = tempMesh;
有人能帮助我吗?!
答案 0 :(得分:2)
如果你想在每张脸上重复纹理n次。
将纹理寻址模式设置为WRAP模式
为方框的每个面设置如下纹理坐标。
A(0, 0) B(n, 0)
-------------------
| |
| |
| |
| |
| |
| |
| |
D(0, n) ------------------- C(n, n)
这是代码示例,我使用原生DirectX,以顶点B为例,它的位置是(5.0,5.0,0),纹理坐标是(0,0.0f),所以纹理重复4次在你的方向。
// Vertex layout
struct Vertex
{
float x, y, z ; // Position
float u, v ; // Texture coordinates
};
Vertex FrontFace[] =
{
{-5.0f, 5.0f, 0, 0, 0}, // Vertex A
{ 5.0f, 5.0f, 0, 4.0f, 0}, // B
{ 5.0f, -5.0f, 0, 4.0f, 4.0f}, // C
{ 5.0f, -5.0f, 0, 4.0f, 0}, // D
} ;
通常,分配给顶点的u和v纹理坐标的范围为0.0到1.0(包括0.0和1.0)。但是,通过在该范围之外指定纹理坐标,您可以创建某些特殊的纹理效果。
有关详细信息,请参阅Texture Addressing Mode。这适用于原生DirectX,但您只需将其应用于C#。