顶点缓冲对象的颜色- DirectX vs OpenGL
colours in Vertex Buffer Objects - DirectX vs OpenGL
我正在开发一个小型游戏引擎。它的一个特点是它应该支持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
};
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 如何在directx/c++中进行平移/缩放操作
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- DrawIndexedInstanced 具有不同的 Index Count per Instance (Directx
- VS 2017 找不到 DirectX 包含文件
- VS 2013 DirectX Project Vertex着色器文件缺失
- 使用 C++ 在 directX 11 中的 VS 2013 中获取 LNK 2019 错误
- 顶点缓冲对象的颜色- DirectX vs OpenGL
- DirectX中的多重着色器vs多重技术