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