Liebe leser
Ich erstelle grade ein kleines Test Programm, das mit DirectX 11 Läuft und ein Dreieck zeichnen soll. Es Arbeitet mit meinem kleinem Framework, was ich nebenbei erstelle. Jedoch läuft nur Direct3D über das Framework. Effekt und Vertex Buffer werden manuel im Hauptprogramm erstellt.
Es geht um die Funktion "D3DX11CreateEffectFromMemory".
Hier ist die Funktion, die einen Effekt erstellt.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
TF_Direct3D11 &D3D = TF_Direct3D11::instance();
DWORD shaderFlags = 0;
#if defined( DEBUG ) || defined( _DEBUG )
shaderFlags |= D3D10_SHADER_DEBUG;
shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;
#endif
ID3D10Blob* compiledShader = 0;
ID3D10Blob* compilationMsgs = 0;
HRESULT hr = D3DX11CompileFromFile(L"color.fx", 0, 0, 0, "fx_5_0", shaderFlags,
0, 0, &compiledShader, &compilationMsgs, 0);
if( compilationMsgs != 0 )
{
MessageBoxA(0, (char*)compilationMsgs->GetBufferPointer(), 0, 0);
compilationMsgs->Release();
return TF_ERROR;
}
// Even if there are no compilationMsgs, check to make sure there were no other errors.
if(FAILED(hr))
{
DXTrace(__FILE__, (DWORD)__LINE__, hr, L"D3DX11CompileFromFile", true);
return TF_ERROR;
}
HR(D3DX11CreateEffectFromMemory(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(),
0, TF_Direct3D11::instance().GetDevice(), &mFX));
mTech = mFX->GetTechniqueByName("ColorTech");
mfxWorldViewProj = mFX->GetVariableByName("gWorldViewProj")->AsMatrix();
return TF_OK;
|
Es kommt immer wieder die Meldung
"Unbehandelte Ausnahme bei 0x0024578f in D3D_Test_DEBUG.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000008."
Die Meldung zeigt auf folgenden Codeteil in der D3DX11CreateEffectFromMemory Funktion
|
C-/C++-Quelltext
|
1
|
VN( *ppEffect = NEW CEffect( FXFlags & D3DX11_EFFECT_RUNTIME_VALID_FLAGS) );
|
Ich bin mir sicher, dass D3D11 korrekt initialisiert wurde, weil im Debugger keine Fehlermeldung erscheint, und weil ich problemlos den Backpuffer Lehren kann. (DeviceContex->Clear...)