我一直在阅读Frank Luna的DX10简介。我编写了我自己的照明程序版本并遇到了错误。我将发布相关代码(据我所知,它是相关的......)
mLights[0].dir = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
mLights[0].ambient = D3DXCOLOR(0.2f, 0.2f, 0.2f, 1.0f);
mLights[0].diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
mLights[0].specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
world = trans;
Wvp = world * view * perspect;
fxVar->SetMatrix((float*)&Wvp);
fxWorld->SetMatrix((float*)&world);
D3DXVECTOR3 eye = { 2.0f, 3.0f, 5.0f };
fxEyePosW->SetRawValue(&eye, 0, sizeof(D3DXVECTOR3));
fxLight->SetRawValue(&mLights[0], 0, sizeof(Light));
当尝试设置Wvp矩阵时,错误是访问冲突(0xC0000005)。我环顾四周,我很确定这意味着我的矩阵没有被填满。虽然,当我注释出设置灯光的线路时,我只能看不到任何东西。那么问题是,为什么灯会导致世界矩阵有访问冲突?他们应该没有任何关系。
如果需要更多代码,请说明。任何帮助表示赞赏。
由于
编辑: 我添加了断点,看起来在第一个循环设置它时会很好但是第二个循环会遇到访问冲突。因此很明显,当设置灯光时,会创建访问冲突。
我在这里得到fxVar:
tech = fx->GetTechniqueByName("tech");
fxLight = fx->GetVariableByName("gLight");
fxEyePos = fx->GetVariableByName("gEyePosW");
fxWorld = fx->GetVariableByName("gWorld")->AsMatrix();
fxVar = fx->GetVariableByName("gWVP")->AsMatrix();
SetMatrix是DirectX库附带的一个函数,它在着色器中设置矩阵。错误出现在这一行:
fxVar->SetMatrix((float*)&Wvp);
当我在着色器中设置gLight时,问题只出现在这一行上。
Wvp是在课程顶部定义的,所以一切都可以看到它。