DirectX9 C++实时重新着色顶点数据
DirectX9 C++ Recoloring Vertex data in real time
我对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函数,以用不同的颜色重新初始化顶点,我之所以没有这样做,是因为它看起来效率很低,而且不实用。
-材料:我还没有实施材料,这是因为我不知道如何(还),因为我希望找到一个更简单的替代方案。我只需要顶点的颜色。如果材料是实现这一目标的唯一途径,我会执行。
-着色器:我知道你可以用着色器为顶点着色,但我几乎没有着色器经验,正如前面所说,我宁愿找到一个更简单的替代方案。是的,我知道着色器很简单,我已经到了可以实时更改着色器中顶点颜色的地步。它是在GLSL,但我相信它不会有太大的不同。当我想添加多个四边形(每个四边形由2个三角形组成的集合)时,问题就来了。我只知道如何更改进入顶点着色器的所有顶点的颜色。不过,和以前一样,如果着色器是实现的唯一方法,我将实现它。请给我指正确的方向。我对着色器如何在低级别上工作知之甚少(我了解概念和流程,只是不知道如何利用我的优势进行有效使用)。
-研究:我到处找,也许我问的问题不正确,但我在任何地方都找不到答案。
这实际上是我第一次发布问题,通常已经有人问过我的问题了。我已经尽力解释我的问题,但如果仍然不清楚,请随时询问更多代码或信息。
附言:我用的是windows8桌面,不确定这是否真的重要。
要更新顶点,您需要执行类似于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上更新它。不需要重新创建顶点缓冲区,只需更新所需的值即可。
您可以定义一个随机函数,然后在数组中添加颜色元素,例如:绿色、蓝色、黄色、红色、紫色等。然后调用随机函数来随机选择数组中的颜色。
像这样:
int arr[15]={10210114018025025018310713010760,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等,以避免取消引用和值覆盖。
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 创建异构顶点数据数组的可移植方法
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- GLSL 将颜色数据从片段着色器发送到顶点着色器似乎总是等于 0
- 使用OpenGL和Eigen来存储顶点数据和glVertexAttribPointer
- 在现有数据结构上使用BGL算法需要什么(边和顶点作为矢量<对象*>)?
- 如何将数据从顶点着色器传递到介于两者之间的片段着色器
- BGL :获取带有数据的顶点描述符
- 如何使用OpenGL将数据发送到顶点着色器
- 尝试将顶点添加到自定义Graph数据结构时出现分段错误
- 将八叉树叶节点的顶点保存在单独的数据结构中
- 将顶点缓冲区绑定到计算着色器以修改数据
- 动态打包 OpenGL 顶点缓冲区对象的数据
- 在英特尔 CPU 上将最近的 8 个顶点插值到随机采样点时,对称 3D 网格的最有效数据布局
- 顶点数据应该以每个pertex或每个属性为基础进行布局吗
- GL顶点数据的QThread数据共享方法
- 如何在OpenGL中使用矢量和结构上传顶点数据
- 在“顶点着色器”中将纹理数据解释为“顶点”数据
- DirectX9 C++实时重新着色顶点数据
- OpenGL-加载顶点数据时glBufferData()上的SegFault