c++ - DirectX ID3DXEFFECT::BeginPass()/EndPass() 问题

标签 c++ winapi directx effects directx-9

我在 3D 模型上使用带效果的 DirectX 9。我已经正确加载了所有模型和效果,并且使用这种方法渲染蒙皮网格在过去没有任何问题......但是,我最近开始在我的项目中使用 DXUT。现在,使用 DXUT,当我尝试渲染带有效果的蒙皮网格时,出现了问题。我已经找到问题所在,但不知道如何解决。以下代码发生在调用 DrawMeshContainer ( LPD3DXMESHCONTAINER pMeshContainer ) 期间。问题是对 BeginPass()/EndPass() 的调用。所有使用此效果的网格都能正确渲染,但当我尝试渲染不使用该效果的对象时,它们会呈现完全黑色……您可以看到该对象,但没有颜色。我在对对象进行渲染调用之前和之后检查了照明状态,但这似乎是有序的。这是问题行的代码。如果我将这些行注释掉,其他对象将正确呈现

for(DWORD iAttrib = 0; iAttrib < numAttributes; ++iAttrib)
{
...
DWORD numPasses = 0;
g_pEffect->Begin(&numPasses D3DFX_DONOTSAVESTATE); // writing from memory...2nd param may use different identifier

for(DWORD iPass = 0; iPass < numPasses; ++iPass)
{
g_pEffect->BeginPass(iPass); // Begin Problem

pMeshContainer->MeshData.pMesh->DrawSubset( iAttrib );

g_pEffect->EndPass(); // End Problem
}
g_pEffect->End();

m_d3ddev->SetVertexShader( NULL );

}
}

BeginPass()/EndPass() 是否会导致我需要考虑的某种类型的状态变化?我还尝试在对 ID3DXMESH::DrawSubset() 的调用上方使用 g_pEffect->CommitChanges() 但没有成功……有什么想法吗?

最佳答案

问题已解决...我必须在过程结束时将像素着色器与顶点着色器一起设置为 NULL:

m_d3ddev->SetPixelShader( NULL )...

关于c++ - DirectX ID3DXEFFECT::BeginPass()/EndPass() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14006369/

相关文章:

c++ - 如何获得在 Mac OS X 上运行的 Homebrew 版本的 GDB?

c++ - mmap 内存区域的总线错误

c++ - CheckMultisampleQualityLevels(...) 表示该卡不支持 MSAA(例如我的 GeForce GTX 780 不支持)?

c++ - 防病毒软件一直将我的项目检测为病毒

c++ - 包含 <algorithm> 和 <limits> 会导致 "invalid pure specifier"编译错误

具有动态内存分配的 C++ constexpr 函数

windows - KillTimer 是必需的吗?

c++ - 设置 WH_KEYBOARD Hook 失败并出现错误 1428

c++ - Win32 - 确定路径是否有可用的巨型图标

opengl - 哪个更好?开始使用 Allegro 或 OpenGL