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

时间:2011-11-26 17:23:42

标签: c++ opengl directx vbo

我正在开发一款小型游戏引擎。它的一个特点是它应该支持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 个答案:

答案 0 :(得分:4)

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

所以你的glColorPointer电话会是这样的:

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

答案 1 :(得分: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
};