我对DirectX非常陌生,我开始掌握API的功能。
我设法使用这些功能正确显示和渲染三角形:
初始化顶点:
void Menu::InitializeMenu(float x, float y, float width, float height, D3DCOLOR color, IDirect3DDevice9* d3dDevice)
{
CUSTOMVERTEX vertices[] =
{
{ x, y, 0.5f, 1.0f, color },
{ x + width, y, 0.5f, 1.0f, color },
{ x + width, y + height, 0.5f, 1.0f, color },
{ x, y, 0.5f, 1.0f, color },
{ x , y + height, 0.5f, 1.0f, color },
{ x + width, y + height, 0.5f, 1.0f, color },
};
if (FAILED(d3dDevice->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_vertexBuffer, NULL)))
return;
void *locked_buffer;
if (FAILED(m_vertexBuffer->Lock(0, sizeof(vertices), (void **)&locked_buffer, 0)))
return;
memcpy(locked_buffer, vertices, sizeof(vertices));
m_vertexBuffer->Unlock();
}
此处的所有内容都在Menu类中定义。
图:
void Menu::RenderMenu(IDirect3DDevice9 *d3dDevice)
{
d3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
d3dDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DRS_DESTBLENDALPHA);
d3dDevice->SetStreamSource(0, m_vertexBuffer, 0, sizeof(CUSTOMVERTEX));
d3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
}
一切都很完美,我渲染了两个三角形,这反过来又产生了一个半透明的四边形。
现在问题: 我希望能够在程序开始渲染后更改三角形中顶点的颜色(所有内容都已初始化并至少渲染一次)。
我一直在考虑的事情: - 我已经考虑过使用不同的参数调用InitializeMenu函数来重新初始化不同颜色的顶点,因为我没有做到这一点是因为它似乎非常低效且不实用。
- 材料:我没有实施材料,这是因为我不知道如何(还)因为我希望找到一个更简单的替代方案。我需要的只是顶点颜色。如果材料是实现这一目标的唯一方法,我将实施。
-Shaders:我知道你可以使用着色器为顶点着色,但是我的着色器经验非常少,而且如前所述,我宁愿找到一个更简单的替代方案。是的,我知道着色器很简单,我已经达到了可以实时更改着色器中顶点颜色的程度。这是在GLSL,但我相信它并没有太大的区别。当我想添加多个四边形(ea quad的2个三角形的集合)时会出现问题。我只知道如何更改进入顶点着色器的所有顶点的颜色。和以前一样,如果着色器是完成的唯一方法,我将实现。请指出我正确的方向。我对于着色器如何在低级别上工作非常了解(我理解概念和流程,只是不知道如何利用我的优势来有效使用)。
- 研究:我到处寻找,也许我没有正确地提出我的问题,但我无法在任何地方找到答案。
这实际上是我第一次发帖提问,通常有人已经问过我的问题了。我尽力解释我的问题,但如果仍然不清楚,可以随意提出更多的代码或信息。
P.S:我正在使用Windows 8桌面,不确定这是否真的很重要。
答案 0 :(得分:0)
要更新顶点,您需要执行类似于InitializeMenu的操作,但不要再次调用CreateVertexBuffer。您还需要对如何创建顶点缓冲区进行一些修改。
有两种类型的顶点缓冲区:静态和动态。静态顶点缓冲区不允许CPU进行更改而动态顶点缓冲区可以进行更改。
要创建动态顶点缓冲区,请将D3DUSAGE_DYNAMIC添加到CreateVertexBuffer:
d3dDevice->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_vertexBuffer, NULL)
然后你可以创建一个这样的新函数来改变颜色:
void Menu::ChangeColor(D3DColor color) {
CUSTOMVERTEX *locked_buffer;
if (FAILED(m_vertexBuffer->Lock(0, 0, (void **)&locked_buffer, 0))) {
return;
}
for (int i=0; i<6; i++) {
// use whatever you called color in your CUSTOMVERTEX struct
locked_buffer[i].color = color;
}
m_vertexBuffer->Unlock();
}
此代码基本上从GPU获取顶点数据,并允许您在CPU上更新它。您不需要重新创建顶点缓冲区,只需更新所需的值即可。
答案 1 :(得分:0)
您可以定义随机函数,然后将颜色元素添加到数组中,即:绿色,蓝色,黄色,红色,紫色等。然后调用随机函数随机选择数组内的颜色。
像这样:
int arr [15] = {10,210,140,180,250,189,183,107,183,107,60,2,55,85,48};
D3DCOLOR color1; D3DCOLOR color2; D3DCOLOR color3; D3DCOLOR color4;
srand(time(NULL));
CUSTOMVERTEX vertices[] =
{{ x, y, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])},
{ x + width, y, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])},
{ x + width, y + height, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])},
{ x, y, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])},
{ x , y + height, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])},
{ x + width, y + height, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])},
};
有一件事,你可能不得不使用不同的D3DCOLOR颜色变量,即; color1,color2,color3等,以避免解除引用和重写值。