цвета в объектах буфера вершин - DirectX против OpenGL - PullRequest
4 голосов
/ 26 ноября 2011

Я работаю над небольшим игровым движком. Одна из его особенностей заключается в том, что он должен поддерживать DirectX и OpenGL рендеринг.

Я использую Vertex Buffer Objects, и у меня есть структура, чтобы определить формат моих вершин. Проблема в том, что я хотел бы иметь возможность использовать одну и ту же структуру для 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 ]

4 голосов
/ 26 ноября 2011

Вам нужно использовать расширение ARB_vertex_array_bgra. Оно специально разработано для взаимодействия с D3D.

Итак, ваш glColorPointer вызов будет выглядеть так:

glColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, sizeof(Vertex), BUFFER_OFFSET12);
1 голос
/ 26 ноября 2011

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