bool CreateShader(char* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3D10Blob** ppBuffer, ID3D10Blob* pBuffer, ID3D11VertexShader* VS, ID3D11PixelShader* PS)
{
DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DCOMPILE_DEBUG;
#endif
sprintf(tmp, "%s%s", pShaders, szFileName);
hr = D3DX11CompileFromFile(tmp, 0, 0, szEntryPoint, szShaderModel,
dwShaderFlags, 0, 0, ppBuffer, 0, 0);
if (FAILED(hr))
{
sprintf(tmp, "Failed to compile Shader: %s : %s", szFileName, szEntryPoint);
Error(tmp);
return false;
}
if (pBuffer!=NULL)
{
if (PS == NULL)
hr = d3d11Device->CreateVertexShader(pBuffer->GetBufferPointer(), pBuffer->GetBufferSize(), NULL, &VS);
else
hr = d3d11Device->CreatePixelShader(pBuffer->GetBufferPointer(), pBuffer->GetBufferSize(), NULL, &PS);
if (FAILED(hr))
{
sprintf(tmp, "Failed to create Shader: %s : %s", szFileName, szEntryPoint);
Error(tmp);
pBuffer->Release();
return false;
}
}
return true;
}
So sieht sie aus...
Der 1. Teil funktioniert.
Das Problem ist, dass der 2. Teil nie ausgeführt wird, weil pBuffer immer NULL ist. :/
Und wo ist die Deklaration (+ Definition) von pBuffer? Vielleicht reservierst du einfach keinen Speicher dafür, bei dem bloßen Funktionsaufruf kann ich nichts relevantes sehen weil dort kaum mit diesem pBuffer gearbeitet wird.
Übrigens hat das nicht mehr viel mit C++ zutun, das ist C.
Und wo ist die Deklaration (+ Definition) von pBuffer? Vielleicht reservierst du einfach keinen Speicher dafür, bei dem bloßen Funktionsaufruf kann ich nichts relevantes sehen weil dort kaum mit diesem pBuffer gearbeitet wird.
pBuffer ist in den Funktionsparamentern deklariert:
Mag sein... C und C++ teilen sich ja eh eine Sektion hier
Ja, die Sprachen teilen sich ne Sektion aber man sollte schon wissen, in welcher Sprache man programmiert. Du hast nämlich im Titel C++ geschrieben, daher gehe ich davon aus, das du es nicht weißt oder bis eben nicht wusstest.
Du brauchst nun logischerweise ne Variable vom Datentyp ID3D10Blob oder eben einen Pointer darauf, letztendlich musst du sowieso immer einen Pointer übergeben. Wo liegt das Problem? Wie Nightblizard schon erwähnt hat, können wir dir nicht helfen, wenn du nicht das postest, was hier relevant ist.
Joa, ist doch klar: pBuffer ist ja ein kopierter von dem ungültigen Pointer vor dem Funktionsaufruf.
Besser du übergibst nur ppBuffer, kreierst das Objekt dann entsprechend und nutzt in CreateShader *ppBuffer, wenn du den einfachen Pointer brauchst. Ferner kreierst du in CreateShader das ShaderObjekt auf das Argument. Und das wird nicht nach außen gereicht. So sollte es klappen (kannst an einigen Stellen auch implizite Referenzen ('&') statt Pointer nehmen, wenn du willst):
Code:
bool CreateShader(char* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3D10Blob** ppBuffer, ID3D11VertexShader** VS, ID3D11PixelShader** PS)
{
DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DCOMPILE_DEBUG;
#endif
sprintf(tmp, "%s%s", pShaders, szFileName);
hr = D3DX11CompileFromFile(tmp, 0, 0, szEntryPoint, szShaderModel,
dwShaderFlags, 0, 0, ppBuffer, 0, 0);
if (FAILED(hr))
{
sprintf(tmp, "Failed to compile Shader: %s : %s", szFileName, szEntryPoint);
Error(tmp);
return false;
}
if (*ppBuffer != NULL)
{
if (PS == NULL)
hr = d3d11Device->CreateVertexShader((*ppBuffer)->GetBufferPointer(), (*ppBuffer)->GetBufferSize(), NULL, VS);
else
hr = d3d11Device->CreatePixelShader((*ppBuffer)->GetBufferPointer(), (*ppBuffer)->GetBufferSize(), NULL, PS);
if (FAILED(hr))
{
sprintf(tmp, "Failed to create Shader: %s : %s", szFileName, szEntryPoint);
Error(tmp);
(*ppBuffer)->Release();
return false;
}
}
return true;
}
Joa, ist doch klar: pBuffer ist ja ein kopierter von dem ungültigen Pointer vor dem Funktionsaufruf.
Besser du übergibst nur ppBuffer, kreierst das Objekt dann entsprechend und nutzt in CreateShader *ppBuffer, wenn du den einfachen Pointer brauchst. Ferner kreierst du in CreateShader das ShaderObjekt auf das Argument. Und das wird nicht nach außen gereicht. So sollte es klappen (kannst an einigen Stellen auch implizite Referenzen ('&') statt Pointer nehmen, wenn du willst):
Code:
bool CreateShader(char* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3D10Blob** ppBuffer, ID3D11VertexShader** VS, ID3D11PixelShader** PS)
{
DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DCOMPILE_DEBUG;
#endif
sprintf(tmp, "%s%s", pShaders, szFileName);
hr = D3DX11CompileFromFile(tmp, 0, 0, szEntryPoint, szShaderModel,
dwShaderFlags, 0, 0, ppBuffer, 0, 0);
if (FAILED(hr))
{
sprintf(tmp, "Failed to compile Shader: %s : %s", szFileName, szEntryPoint);
Error(tmp);
return false;
}
if (*ppBuffer != NULL)
{
if (PS == NULL)
hr = d3d11Device->CreateVertexShader((*ppBuffer)->GetBufferPointer(), (*ppBuffer)->GetBufferSize(), NULL, VS);
else
hr = d3d11Device->CreatePixelShader((*ppBuffer)->GetBufferPointer(), (*ppBuffer)->GetBufferSize(), NULL, PS);
if (FAILED(hr))
{
sprintf(tmp, "Failed to create Shader: %s : %s", szFileName, szEntryPoint);
Error(tmp);
(*ppBuffer)->Release();
return false;
}
}
return true;
}
Will das Spiel starten und dann kommt NULL NULL 12/08/2011 - Kal Online - 2 Replies Also wie im titel schon gesagt ist habe ich wenn ich das spiel starten will ein kleines fenster mit zwei "NULL NULL" buttons kann mir jemand helfen wie ich jetzt spielen und das problem lösen kann. wäre cool wenn schnell eine antwort kommt
danke, gruß:D:D
How to kill Dark Colluseast: Null and Steelation: Null (TT 3-1)? 06/10/2011 - PW Hacks, Bots, Cheats, Exploits - 1 Replies Can anyone tell me How to kill Dark Colluseast: Null and Steelation: Null (TT 3-1)?
:handsdown:
After patch 121 or mermaid update, the boss, Dark Colluseast: Null and Steelation: Null, has a random aggro, area stun, and area banish.
:confused: