2011-11-26 177 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