directx - D3D9 顶点中字段的位置(位置、法线等)

标签 directx direct3d

我正在尝试读取为 DirectX 应用程序创建的 3D 模型,这些模型定义如下:

  • 在文件头中,给出了网格的灵活顶点格式(FVF)(实际上,我在我测试的网格中有 D3DFVF_{XYZ,DIFFUSE,NORMAL,TEX1,TEX2} 的任意组合)
  • 然后,n顶点以线性模式给出,字段根据 FVF 呈现。

  • 但是,我不知道这些字段的顺序。逻辑是它是在 DirectX 文档中的某个地方定义的,但我找不到它。例如,这两个结构中哪一个是正确的 FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL (C 语法,但这个问题适用于每种语言) ?
    // This one ?
    struct vertex1
    {
        D3DVERTEX pos;
        DWORD color;
        D3DVERTEX normal;
    };
    
    // Or this one ?
    struct vertex2
    {
        D3DVERTEX pos;
        D3DVERTEX normal;
        DWORD color;
    };
    

    我想要一个包含所有可能字段的一般性答案(例如, XYZ before DIFFUSE before NORMAL before TEX1 before TEX2 )。指向文档右侧页面的指针也可以,因为我找不到它:)。

    最佳答案

    我自己也遇到了同样的事情。

    我认为位的顺序是所需的顺序。来自 d3d9types.h:

    #define D3DFVF_RESERVED0        0x001
    #define D3DFVF_POSITION_MASK    0x400E
    #define D3DFVF_XYZ              0x002
    #define D3DFVF_XYZRHW           0x004
    #define D3DFVF_XYZB1            0x006
    #define D3DFVF_XYZB2            0x008
    #define D3DFVF_XYZB3            0x00a
    #define D3DFVF_XYZB4            0x00c
    #define D3DFVF_XYZB5            0x00e
    #define D3DFVF_XYZW             0x4002
    
    #define D3DFVF_NORMAL           0x010
    #define D3DFVF_PSIZE            0x020
    #define D3DFVF_DIFFUSE          0x040
    #define D3DFVF_SPECULAR         0x080
    
    #define D3DFVF_TEXCOUNT_MASK    0xf00
    #define D3DFVF_TEXCOUNT_SHIFT   8
    #define D3DFVF_TEX0             0x000
    #define D3DFVF_TEX1             0x100
    #define D3DFVF_TEX2             0x200
    #define D3DFVF_TEX3             0x300
    #define D3DFVF_TEX4             0x400
    #define D3DFVF_TEX5             0x500
    #define D3DFVF_TEX6             0x600
    #define D3DFVF_TEX7             0x700
    #define D3DFVF_TEX8             0x800
    

    我很确定您要查找的订单是:

    位置,正常,PSIZE,漫反射,镜面反射,TEX0[,TEXn...]

    我也无法在文档中找到明确的答案。

    关于directx - D3D9 顶点中字段的位置(位置、法线等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514796/

    相关文章:

    c# - 如何在没有延迟的情况下在 Windows 中重新定位图形?

    c - 用 GDI 绘制 opengl/D3D?

    c - 当后台缓冲区像素格式设置为 DXGI_FORMAT_B8G8R8X8_UNORM 时,为什么 D3D11CreateDeviceAndSwapChain 会失败?

    c++ - IDirect3DDevice9::Reset 异常的原因可能是什么?

    c++ - 异常(exception):设备为nullptr。 D3D11中的读取访问冲突

    c++ - 将 DirectX 接口(interface)转换为 IUnknown 指针

    windows-8 - d3dx11.h 不在 Windows 8.0 套件中

    c++ - 检查 Windows 8 中的设备(PC/平板电脑)是什么

    c - 来自 directx 应用程序的 Bitblt

    c++ - 为什么只检查某些值的错误? (C++?)