顶点缓冲区中的颜色 - DirectX与OpenGL的区别

4

我正在开发一个小型游戏引擎。其中一个特性是支持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代码中的结构体。

2个回答

4
你需要做的是使用ARB_vertex_array_bgra 扩展。它专门为D3D互操作而设计。
因此,你的glColorPointer调用应该像这样:
glColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, sizeof(Vertex), BUFFER_OFFSET12);

太棒了,就是这样!很高兴OpenGL完成了那个交互步骤 ;) - Shikamu

1
一个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。 - Shikamu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接