#1 04.02.2015 15:15:59

headfime
Newbie
Registriert: 04.02.2015
Beiträge: 2

DirectX11 Compile Shader from File

Der letzte Beitrag hier zu DirectX ist zwar schon 2 Jahre alt, aber ich schreibe das hier in der Hoffnung, dass das doch noch irgendwer liest wink

Ich arbeite zur Zeit mit dem Buch "Beginning DirectX 11 Game Programming", und versuche, die C++ Quellcodes nach Delphi zu übertragen. Ich benutze die DelphiDev DirectX headers.
Hier die Prozedur, deren Rückgabewert meldet, dass die Funktion "nicht erfolgreich" war:

Code: Delphi

D3DX11CompileFromFile(
    PWideChar(filePath), nil, nil,
    PAnsiChar(entry),
    PAnsiChar(shaderModel),
    shaderFlags, 0, nil,
    buffer,
    errorBuffer, nil);


hier die ganze Funktion:

Code: Delphi

function TDx11Base.CompileMyShader(filePath: String; entry, shaderModel: AnsiString;
  var buffer: ID3DBlob): Boolean;
var
  shaderFlags: DWORD;
  errorBuffer: ID3DBlob;
  rslt: HRESULT;
begin
  shaderFlags := D3DCOMPILE_ENABLE_STRICTNESS;
  errorBuffer := nil;
  rslt := D3DX11CompileFromFile(
    PWideChar(filePath), TD3D_ShaderMacro(nil^), nil,
    PAnsiChar(entry),
    PAnsiChar(shaderModel),
    shaderFlags, 0, nil,
    buffer,
    errorBuffer, nil);

  if Failed(rslt) then begin
    if errorBuffer <> nil then begin
      OutputDebugStringA(errorBuffer.GetBufferPointer);
    end;
    Result := false;
    exit;
  end;
  Result := true;
end;


Der errorBuffer ist auch nach dem Aufruf nil.

Man vergleiche die Funktion aus dem Delphi-Wrapper mit der C++ Funktion aus dem MSDN:

Code: Delphi

D3DX11CompileFromFile(
  pSrcFile: PWideChar;
  const Defines: TD3D10_ShaderMacro;
  Include: ID3D10Include;
  pFunctionName: PAnsiChar;
  pProfile: PAnsiChar;
  Flags1: LongWord;
  Flags2: LongWord;
  Pump: ID3DX11ThreadPump;
  out Shader: ID3D10Blob;
  out ErrorMsgs: ID3D10Blob;
  pHResult: PHResult): HResult;

Code: C++

HRESULT D3DX11CompileFromFile(
  __in   LPCTSTR pSrcFile,
  __in   const D3D10_SHADER_MACRO *pDefines,
  __in   LPD3D10INCLUDE pInclude,
  __in   LPCSTR pFunctionName,
  __in   LPCSTR pProfile,
  __in   UINT Flags1,
  __in   UINT Flags2,
  __in   ID3DX11ThreadPump *pPump,
  __out  ID3D10Blob **ppShader,
  __out  ID3D10Blob **ppErrorMsgs,
  __out  HRESULT *pHResult
);

Ich (als relativ unerfahrener Delphianer) vermute, dass daran irgend eine Referenzierung / Dereferenzierung schuld ist, die die C++ Funktion von der Delphi-Funktion unterscheidet.
Z.B. heißt es im MSDN, man solle, falls man keine Shader-Makros benötige, null übergeben. Dies ist in Delphi gar nicht möglich, da kein Pointer auf das Makro übergeben wird, sondern das Makro selbst, welches aber ein Record ist (und damit nicht nil).

Der Vollständigkeit halber hier noch die Shader, die ich übersetzen will:

Code: HLSL

float4 VS_Main(float4 pos: POSITION): SV_POSITION
{
  return pos;
}

float4 PS_Main(float4 pos: SV_POSITION): SV_TARGET
{
  return float4(0.0f, 1.0f, 0.0f, 1.0f);
}


Ich danke jetzt schonmal allen, die sich das hier durchgelesen haben big_smile und hoffe, dass irgendwer hierauf eine Antwort weiß smile

Vielen Dank und viele Grüße,
headfime

Offline

 

#2 05.02.2015 16:57:19

headfime
Newbie
Registriert: 04.02.2015
Beiträge: 2

Re: DirectX11 Compile Shader from File

Ok, ich gebe zu, dass das ein eher blöder Fehler war..
Aber falls doch jemand an der Lösung interessiert ist:
Der Aufruf hat so schon gestimmt, aber der Shader muss im selben Ordner wie die .exe Datei sein ^^

Viele Grüße,
headfime

Offline

 

#3 07.02.2015 10:53:30

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: DirectX11 Compile Shader from File

^^ die einfachen Fehler sind immer die Schlimmsten, ich hätt jetzt auch auf Headerprobleme getippt. Aber sowas erwartet man am wenigsten wink


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson