当光照启用时,DirectX 9顶点颜色会消失

DirectX 9 vertex colors ingored when lighting is enabled?

本文关键字:顶点 颜色 消失 DirectX 启用      更新时间:2023-10-16

问题已经说明了。当我禁用光(pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);)时,我得到预期的颜色,当我将其设置为true时,我得到纯黑色,即使我设置环境光,但这在设置材料时也是固定的。但是顶点的颜色被完全忽略了,我只得到环境光的颜色。

目前为止的搜索:我发现的唯一有用的文章是这个顶点照明教程,但是它从顶点上删除了漫反射颜色,取而代之的是添加了一个法向量。同样在MSDN上,关于漫射照明,它没有参考顶点的颜色。我开始怀疑顶点的颜色,就像RHW值一样,通常是在运行时计算的,在声明期间设置它只是在不需要照明的情况下给出颜色。就是这样吗?

lighting-related代码:

pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
pd3dDevice->SetRenderState(D3DRS_COLORVERTEX, TRUE); // not sure if needed
pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_ARGB(22, 255, 255, 255)); // no visible difference on A
pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); // probably not needed yet, can't harm
D3DMATERIAL9 material;
D3DCOLORVALUE zeroColor;
D3DCOLORVALUE oneColor;
zeroColor.a = 0;
zeroColor.r = 0;
zeroColor.g = 0;
zeroColor.b = 0;
oneColor.a = 0; // no perceivable difference between 0 and 1
oneColor.r = 1;
oneColor.g = 1;
oneColor.b = 1;
material.Ambient = oneColor;
material.Diffuse = zeroColor; //setting it to oneColor has no effect
material.Emissive = zeroColor;
material.Power = 0; //no difference if 0 or 1
material.Specular = zeroColor;
pd3dDevice->SetMaterial(&material);

如果你想使用顶点颜色作为光照计算的输入,你需要将渲染状态D3DRS_AMBIENTMATERIALSOURCE设置为D3DMCS_COLOR1(用于漫射顶点颜色)。这同样适用于其他颜色组件。