2011-11-26 134 views
4

我正在研究一个小型游戏引擎。它的一个特点是它应该支持DirectX和OpenGL渲染。颜色 - DirectX vs 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代码。

回答

4

你需要什么do是采用ARB_vertex_array_bgra extension.它专门为D3D interop设计的。

所以你glColorPointer电话是这样的:

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

辉煌,就是这样!很高兴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 
}; 
+0

感谢您的回答,这几乎呀!我正在尝试像glColorPointer(1,GL_UNSIGNED_INT,sizeof(Vertex),BUFFER_OFFSET12);还有一件事,使用这个,OpenGL似乎将我的颜色解释为ABGR和DirectX使用ARGB – Shikamu