|
You last visited: Today at 13:58
Advertisement
[C++] ID3D10Blob* ist immer NULL
Discussion on [C++] ID3D10Blob* ist immer NULL within the C/C++ forum part of the Coders Den category.
06/25/2014, 22:31
|
#1
|
elite*gold: 0
Join Date: Jul 2011
Posts: 331
Received Thanks: 64
|
[C++] ID3D10Blob* ist immer NULL
Hi,
ich hab angefangen mit DirectX ein kleines Spiel zu schreiben.
Um das Laden der Shader zu vereinfachen wollte ich mir eine Funktion schreiben:
Code:
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. :/
Aufrufen tu ich sie so:
Code:
//Compile Shaders from shader file
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, VS_Buffer, VS, NULL);
Ich bin mir relativ sicher, dass es an dem Übergabeparameter pBuffer liegt. Nur weiß ich nicht warum dieser immer NULL ist :/
Hat jemand ne Ahnung wieso das so ist? Ich kenn mich mit Shader in DirectX noch nicht sooo aus!
mfg
lolxdfly
|
|
|
06/26/2014, 23:40
|
#2
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
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.
|
|
|
06/27/2014, 13:44
|
#3
|
elite*gold: 0
Join Date: Jul 2011
Posts: 331
Received Thanks: 64
|
Quote:
Originally Posted by Mostey
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:
Code:
bool CreateShader(char* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3D10Blob** ppBuffer, ID3D10Blob* pBuffer, ID3D11VertexShader* VS, ID3D11PixelShader* PS)
Definiert wird es durch die Übergabe von VS_Buffer:
Code:
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, VS_Buffer, VS, NULL);
Quote:
Originally Posted by Mostey
Übrigens hat das nicht mehr viel mit C++ zutun, das ist C.
|
Mag sein... C und C++ teilen sich ja eh eine Sektion hier
|
|
|
06/27/2014, 22:30
|
#4
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Code:
void foo(int bar)
{
//...
}
"bar" hat den falschen Werten, weshalb "foo" fehlschlägt. Was ist an "foo" falsch?
|
|
|
06/28/2014, 03:15
|
#5
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Quote:
Originally Posted by lolxdflyx3
pBuffer ist in den Funktionsparamentern deklariert:
Code:
bool CreateShader(char* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3D10Blob** ppBuffer, ID3D10Blob* pBuffer, ID3D11VertexShader* VS, ID3D11PixelShader* PS)
Definiert wird es durch die Übergabe von VS_Buffer:
Code:
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, VS_Buffer, VS, NULL);
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.
|
|
|
06/28/2014, 11:03
|
#6
|
elite*gold: 0
Join Date: Jul 2011
Posts: 331
Received Thanks: 64
|
Ich weiß nicht genau was genau dir noch an Code fehlt.. :/
Hier sind noch ein paar Sachen, die damit zutun haben:
Code:
ID3D10Blob* VS_Buffer;
An der Shader-Datei kann es nicht liegen, da es ohne die nutzung vom 2. Teil der CreateShader funktion einwandfrei funktioniert:
Code:
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, VS_Buffer, VS, NULL); // 2. Teil auskommentiert
//Create the Shader Objects
hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);
if (FAILED(hr))
{
Error("Failed to create Shader: Effects.fx");
VS_Buffer->Release();
return false;
}
//...
//Create the Input Layout
hr = d3d11Device->CreateInputLayout(layout, numElements, VS_Buffer->GetBufferPointer(),
VS_Buffer->GetBufferSize(), &vertLayout); // hier noch etwas, was mit VS_Buffer zutun hat
|
|
|
06/28/2014, 15:16
|
#7
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Quote:
Originally Posted by Mostey
Übrigens hat das nicht mehr viel mit C++ zutun, das ist C.
|
Wäre mir neu, dass C Klassen hat.
Quote:
Originally Posted by lolxdflyx3
Ich weiß nicht genau was genau dir noch an Code fehlt.. :/
Hier sind noch ein paar Sachen, die damit zutun haben:
Code:
ID3D10Blob* VS_Buffer;
An der Shader-Datei kann es nicht liegen, da es ohne die nutzung vom 2. Teil der CreateShader funktion einwandfrei funktioniert:
Code:
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, VS_Buffer, VS, NULL); // 2. Teil auskommentiert
//Create the Shader Objects
hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);
if (FAILED(hr))
{
Error("Failed to create Shader: Effects.fx");
VS_Buffer->Release();
return false;
}
//...
//Create the Input Layout
hr = d3d11Device->CreateInputLayout(layout, numElements, VS_Buffer->GetBufferPointer(),
VS_Buffer->GetBufferSize(), &vertLayout); // hier noch etwas, was mit VS_Buffer zutun hat
|
Weist du VS_Buffer denn auch einen Wert zu?
|
|
|
06/28/2014, 15:57
|
#8
|
elite*gold: 0
Join Date: Jul 2011
Posts: 331
Received Thanks: 64
|
Quote:
Originally Posted by MrSm!th
Wäre mir neu, dass C Klassen hat.
Weist du VS_Buffer denn auch einen Wert zu?
|
Ja, ich denke schon...
Müsste hier passieren:
Code:
hr = D3DX11CompileFromFile(tmp, 0, 0, szEntryPoint, szShaderModel,
dwShaderFlags, 0, 0, ppBuffer, 0, 0); // ppBuffer = &VS_Buffer
Ich denke nicht, dass es an VS_Buffer liegt. Schließlich läuft folgender Code ja fehlerfrei:
Code:
hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);
if (FAILED(hr))
{
Error("Failed to create Shader: Effects.fx");
VS_Buffer->Release();
return false;
}
Nur wenn ich VS_Buffer übergebe friert es ein, sobald ich pBuffer "anspreche".
|
|
|
06/28/2014, 16:15
|
#9
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,104
Received Thanks: 681
|
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;
}
Aufruf dann halt mit:
Code:
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, &VS, NULL);
Sowohl VS, wie auch VS_Buffer sollten nun gültig sein und du kannst mit ihnen arbeiten
MfG
Jeoni
|
|
|
06/28/2014, 16:41
|
#10
|
elite*gold: 0
Join Date: Jul 2011
Posts: 331
Received Thanks: 64
|
Quote:
Originally Posted by Jeoni
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;
}
Aufruf dann halt mit:
Code:
CreateShader("Effects.fx", "VS", "vs_4_0", &VS_Buffer, &VS, NULL);
Sowohl VS, wie auch VS_Buffer sollten nun gültig sein und du kannst mit ihnen arbeiten
MfG
Jeoni
|
Damit gehts. Genau das, was ich gesucht habe
Danke
|
|
|
06/28/2014, 17:48
|
#11
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Quote:
Originally Posted by MrSm!th
Wäre mir neu, dass C Klassen hat.
|
Mir auch, das könnten allerdings trotzdem normale Structs sein oder gibt es hier ein entscheidendes Merkmal, was ich übersehen habe?
|
|
|
06/28/2014, 19:50
|
#12
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
|
Quote:
Originally Posted by Mostey
Mir auch, das könnten allerdings trotzdem normale Structs sein oder gibt es hier ein entscheidendes Merkmal, was ich übersehen habe?
|
Welcher C-Standard erlaubt Structs, (virtuelle) Funktionen zu callen? Nur weil im Code 1x sprintf verwendet wurde, ist das nicht C.
|
|
|
06/29/2014, 20:21
|
#13
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Die DirectX Interfaces sind aber keine Structs, simple as that
|
|
|
Similar Threads
|
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
|
-Null-
08/13/2011 - Rappelz - 1 Replies
-Null-
|
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:
|
All times are GMT +2. The time now is 13:58.
|
|