2010-05-23 64 views
1

我遇到的问题是从directx加载我的effect.fx。当我进入我的应用程序时,我的ID3D10Effect * m_pDefaultEffect;指针保持空白。地址保持在0x000000处无法检索effect.fx文件

下面是我的代码

#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; 
    } 

}; 
下面

是实现

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; 
} 

我的DirectX设备不工作。 我effect.fx文件是在同一文件夹作为我的解决方案文件(的.cpp文件和头文件)

alt text

[编辑]

alt text

我试图把effect.fx在与可执行文件相同的文件夹

我一直在搞乱一些其他的代码,我有工作。我不知道这一点,但似乎.fx文件的布局可以影响我是否成功上传文件。所以,我提供我的效果代码以及

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与二进制文件位于同一文件夹中吗? – 2010-05-23 23:51:14

+0

如果你的意思是exe文件。不,这不对。 – numerical25 2010-05-24 00:01:08

+0

您是否在调用“D3DX10CreateEffectFromFile”后检查了“hr”的值?它给出的错误代码是什么? – Jujjuru 2010-05-24 00:44:58

回答

0

想通了

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

应该

SetVertexShader(CompileShader(vs_4_0, DefaultVS())); 
SetPixelShader(CompileShader(ps_4_0, DefaultPS())); 
的结果

。有问题的HLSL代码可能会导致D3DX10CreateEffectFromFile失败。