C# 如何计算纹理坐标?

C# 如何计算纹理坐标?,c#,directx,texture-mapping,C#,Directx,Texture Mapping,我有一个程序,用户可以创建不同宽度和高度的盒子 我还有一个纹理(512 x 512像素),应该放在每个盒子上 现在我的问题是,在90x90长方体(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(

我有一个程序,用户可以创建不同宽度和高度的盒子

我还有一个纹理(512 x 512像素),应该放在每个盒子上

现在我的问题是,在90x90长方体(
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;
float tex_coords_w=4.0f/90;
浮球坐标h=4.0f/90;
网格=网格框(D3D设备,宽度,高度,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.NumberTices);
对于(int i=vertData.Length/2;i

谁能帮帮我吗

如果要在每个面上重复纹理n次

  • 将纹理寻址模式设置为包裹模式

  • 为长方体的每个面设置纹理坐标,如下所示

        A(0, 0)                    B(n, 0)
               -------------------
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
        D(0, n) ------------------- C(n, n)
    
  • 这里是代码示例,我使用的是原生DirectX,以顶点B为例,它的位置是(5.0,5.0,0),纹理坐标是(0,4.0f),因此纹理在u方向重复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)。但是,通过指定该范围之外的纹理坐标,可以创建某些特殊的纹理效果


    有关详细信息,请参阅。这是针对本机DirectX的,但如果要在每个面上重复纹理n次,只需在C#中应用它即可

  • 将纹理寻址模式设置为包裹模式

  • 为长方体的每个面设置纹理坐标,如下所示

        A(0, 0)                    B(n, 0)
               -------------------
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
        D(0, n) ------------------- C(n, n)
    
  • 这里是代码示例,我使用的是原生DirectX,以顶点B为例,它的位置是(5.0,5.0,0),纹理坐标是(0,4.0f),因此纹理在u方向重复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)。但是,通过指定该范围之外的纹理坐标,可以创建某些特殊的纹理效果


    有关详细信息,请参阅。这是针对本机DirectX的,但如果要在每个面上重复纹理n次,只需在C#中应用它即可

  • 将纹理寻址模式设置为包裹模式

  • 为长方体的每个面设置纹理坐标,如下所示

        A(0, 0)                    B(n, 0)
               -------------------
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
        D(0, n) ------------------- C(n, n)
    
  • 这里是代码示例,我使用的是原生DirectX,以顶点B为例,它的位置是(5.0,5.0,0),纹理坐标是(0,4.0f),因此纹理在u方向重复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)。但是,通过指定该范围之外的纹理坐标,可以创建某些特殊的纹理效果


    有关详细信息,请参阅。这是针对本机DirectX的,但如果要在每个面上重复纹理n次,只需在C#中应用它即可

  • 将纹理寻址模式设置为包裹模式

  • 为长方体的每个面设置纹理坐标,如下所示

        A(0, 0)                    B(n, 0)
               -------------------
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
               |                 |
        D(0, n) ------------------- C(n, n)
    
  • 这里是代码示例,我使用的是原生DirectX,以顶点B为例,它的位置是(5.0,5.0,0),纹理坐标是(0,4.0f),因此纹理在u方向重复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)。但是,通过指定该范围之外的纹理坐标,可以创建某些特殊的纹理效果


    有关详细信息,请参阅。这是针对本机DirectX的,但您只需在C#中应用即可。

    您好,谢谢您的回答。这对我的for循环意味着什么?你能给我举个例子吗?Thanksuppose vertData[0]从面的左上角开始,然后按顺时针顺序跟随vertData[123],您可以尝试以下代码。
    vertData[0]。Tu=0;vertData[0].Tv=0;vertData[1].Tu=1;vertData[1]。Tv=0;vertData[2].Tu=1;vertData[2]。Tv=1;vertData[3]。Tu=0;vertData[3]。Tv=1你好,谢谢你的回答。这对我的for循环意味着什么?你能给我举个例子吗?Thanksuppose vertData[0]从面的左上角开始,然后按顺时针顺序跟随vertData[123],您可以尝试以下代码。
    vertData[0]。Tu=0;vertData[0].Tv=0;vertData[1].Tu=1;vertData[1]。Tv=0;vertData[2].Tu=1;vertData[2]。Tv=1;vertData[3]。Tu=0;vertData[3]。Tv=1你好,谢谢你的回答。这对我的for循环意味着什么?你能给我举个例子吗?Thanksuppose vertData[0]从面的左上角开始,然后按顺时针顺序跟随vertData[123],您可以尝试以下代码。
    vertData[0]。Tu=0;vertData[0].Tv=0;vertData[1].Tu=1;vertData[1]。Tv=0;vertData[2].Tu=1;vertData[2]。Tv=1;vertData[3]。Tu=0;vertData[3]。Tv=1