2010-05-23 5 views
1

J'ai des problèmes de chargement de mon effect.fx de directx. Quand je rentre dans mon application, mon ID3D10Effect * m_pDefaultEffect; le pointeur reste vide. l'adresse reste à 0x000000ne peut pas récupérer le fichier effect.fx

ci-dessous est mon code

#pragma once 
#include "stdafx.h" 
#include "resource.h" 
#include "d3d10.h" 
#include "d3dx10.h" 
#include "dinput.h" 


#define MAX_LOADSTRING 100 

class RenderEngine { 
protected: 

    RECT m_screenRect; 

    //direct3d Members 
    ID3D10Device *m_pDevice; // The IDirect3DDevice10 
    // interface 
    ID3D10Texture2D *m_pBackBuffer; // Pointer to the back buffer 
    ID3D10RenderTargetView *m_pRenderTargetView; // Pointer to render target view 
    IDXGISwapChain *m_pSwapChain; // Pointer to the swap chain 
    RECT m_rcScreenRect; // The dimensions of the screen 

    ID3D10Texture2D *m_pDepthStencilBuffer; 
    ID3D10DepthStencilState *m_pDepthStencilState; 
    ID3D10DepthStencilView *m_pDepthStencilView; 

    //transformation matrixs 
    D3DXMATRIX g_mtxWorld; 
    D3DXMATRIX g_mtxView; 
    D3DXMATRIX g_mtxProj; 

    //Effect members 
    ID3D10Effect *m_pDefaultEffect; 
    ID3D10EffectTechnique *m_pDefaultTechnique; 

    ID3DX10Font *m_pFont; // The font used for rendering text 
    // Sprites used to hold font characters 
    ID3DX10Sprite *m_pFontSprite; 

    ATOM RegisterEngineClass(); 
    void DoFrame(float); 
    bool LoadEffects(); 

public: 
    static HINSTANCE m_hInst; 
    HWND m_hWnd; 
    int m_nCmdShow; 
    TCHAR m_szTitle[MAX_LOADSTRING];     // The title bar text 
    TCHAR m_szWindowClass[MAX_LOADSTRING];   // the main window class name 

    void DrawTextString(int x, int y, D3DXCOLOR color, const TCHAR *strOutput); 

    //static functions 
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 
    static INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); 

    bool InitWindow(); 
    bool InitDirectX(); 
    bool InitInstance(); 
    int Run(); 
    void ShutDown(); 

    RenderEngine() 
    { 
     m_screenRect.right = 800; 
     m_screenRect.bottom = 600; 
    } 

}; 

ci-dessous est la mise en œuvre

bool RenderEngine::LoadEffects() 
{ 
    HRESULT hr; 

    ID3D10Blob *pErrors = 0; 
    // Create the default rendering effect 
    LPCWSTR effectFilename = L"effect.fx"; 

    hr = D3DX10CreateEffectFromFile(effectFilename, NULL, NULL, 
    "fx_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, m_pDevice, NULL, NULL, &m_pDefaultEffect, 
    &pErrors, NULL); 


    if(pErrors)// at this point, m_pDefaultEffect is still empty but pErrors returns data which means there is 
    {//errors 
     return false; //ends here 
    } 

    //m_pDefaultTechnique = m_pDefaultEffect->GetTechniqueByName("DefaultTechnique"); 

    return true; 
} 

Mon directx appareil fonctionne. Mon fichier effect.fx est dans le même dossier que mes fichiers de solution (fichiers .cpp et en-tête)

alt text

[modifier]

alt text

J'ai essayé de mettre en effect.fx le même dossier que l'exécutable aussi

J'ai été déconner avec un autre code que j'ai qui fonctionne. Je ne le savais pas mais il semble que la mise en page du fichier .fx peut affecter si je télécharge le fichier avec succès ou non. Donc, j'ai fourni mon code d'effet ainsi

matrix g_mtxWorld; 
matrix g_mtxView; 
matrix g_mtxProj; 

#define MAX_LIGHTS 10 // Ensure this is the same as the C++ value 

int4 g_viLightStatus; 
float4 g_vLightColors[MAX_LIGHTS]; 
float4 g_vLightDirections[MAX_LIGHTS]; 

struct VS_INPUT 
{ 
    float3 vPosition : POSITION; 
    float3 vNormal : NORMAL; 
    float4 vColor : COLOR0; 
    float2 vTexCoords : TEXCOORD; 
}; 

struct VS_OUTPUT 
{ 
    float4 vPosition : SV_POSITION; 
    float3 vNormal : NORMAL; 
    float4 vColor : COLOR0; 
}; 

VS_OUTPUT DefaultVS(VS_INPUT dataIn) 
{ 
    VS_OUTPUT result; 

    float4 vPos = float4(dataIn.vPosition, 1.0f); 
    float4 vFinalPos = mul(vPos, g_mtxWorld); 
    vFinalPos = mul(vFinalPos, g_mtxView); 
    vFinalPos = mul(vFinalPos, g_mtxProj); 
    result.vPosition = vFinalPos; 
    result.vNormal = float3(0,0,0); 
    result.vColor = float4(1,0,0,0); 
    return result; 
} 

float4 DefaultPS(VS_OUTPUT dataIn) : SV_Target 
{ 
    return dataIn.vColor; 
} 

technique10 DefaultTechnique 
{ 
    pass Pass0 
    { 
     SetGeometryShader(NULL); 
     SetVertexShader(CompileShader(vs_4_0, VS())); 
     SetPixelShader(CompileShader(ps_4_0, PS())); 
    } 
} 
+0

Effect.fx se trouve-t-il dans le même dossier que le fichier binaire? –

+0

si vous voulez dire le fichier exe. non ce n'est pas. – numerical25

+0

Avez-vous vérifié la valeur de "hr" après l'appel à "D3DX10CreateEffectFromFile"? Quel est le code d'erreur qu'il a donné? – Jujjuru

Répondre

0

figured it out

SetVertexShader(CompileShader(vs_4_0, VS())); 
SetPixelShader(CompileShader(ps_4_0, PS())); 

devrait être

SetVertexShader(CompileShader(vs_4_0, DefaultVS())); 
SetPixelShader(CompileShader(ps_4_0, DefaultPS())); 

en résultat. Le code HLSL buggé peut provoquer l'échec de D3DX10CreateEffectFromFile.

Questions connexes