【问题标题】:colours in Vertex Buffer Objects - DirectX vs OpenGL顶点缓冲区对象中的颜色 - DirectX 与 OpenGL
【发布时间】:2012-01-06 23:43:22
【问题描述】:

我正在开发一个小型游戏引擎。它的特点之一是它应该支持 DirectX 和 OpenGL 渲染。

我正在使用顶点缓冲区对象,并且我有一个结构来定义我的顶点格式。问题是我希望能够对 DirectX 和 OpenGL 使用相同的结构,这样我就可以从 DirectX 渲染组件切换到 OpenGL 组件,而无需更改对象的顶点。

这可能吗?

目前,我对 DirectX 使用以下结构:

struct Vertex{
float position[3];      // x, y, z
float normal[3];        // nx, ny, nz
DWORD colour;           // The vertex color
float texture[2];       // u, v
};

还有:

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1 ) 

作为灵活的顶点格式。

我对OpenGL的理解告诉我,当我想绘制我的对象时,我可以用这个命令告诉我颜色:

glColorPointer(4, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET24);

在绘图例程中,假设颜色有 4 个分量。确实,这行得通。但是我不相信我可以告诉 OpenGL 使用无符号整数来完成此任务,因此我正在使用:

struct Vertex{
float position[3];      // x, y, z
float normal[3];        // nx, ny, nz
float colour[4];        // r, g, b, a
float texture[2];       // u, v
};

我的 OpenGL 代码的结构。

【问题讨论】:

    标签: c++ opengl directx vbo


    【解决方案1】:

    您需要做的是使用 ARB_vertex_array_bgra extension. 它专为 D3D 互操作而设计。

    所以你的glColorPointer 电话看起来像这样:

    glColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, sizeof(Vertex), BUFFER_OFFSET12);
    

    【讨论】:

    • 太棒了,就是这样!很高兴 OpenGL 完成了互操作步骤 ;)
    【解决方案2】:

    DWORD 是一个 32 位无符号整数。据我所知,directx 将其读取为 4 组,每组 8 位,每组代表一个颜色通道。

    您可以在 OpenGL 中通过告诉它读取无符号字节而不是浮点数来完成同样的事情:

    glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), BUFFER_OFFSET12);
    

    您必须将 OpenGL 结构更改为

    struct Vertex{
    float position[3];      // x, y, z
    float normal[3];        // nx, ny, nz
    unsigned int colour;
    float texture[2];       // u, v
    };
    

    【讨论】:

    • 谢谢你的回答,差不多了!我正在尝试 glColorPointer(1, GL_UNSIGNED_INT, sizeof(Vertex), BUFFER_OFFSET12);不过还有一件事,使用它,OpenGL 似乎将我的颜色解释为 ABGR 而 DirectX 使用 ARGB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多