顶点缓冲对象的颜色- DirectX vs OpenGL

colours in Vertex Buffer Objects - DirectX vs OpenGL

本文关键字:DirectX vs OpenGL 颜色 缓冲 对象 顶点      更新时间:2023-10-16

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

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

所以你的glColorPointer调用看起来像这样:

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

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
};