I am having issues loading my effect.fx from directx. When I step into my application, my ID3D10Effect *m_pDef开发者_如何学PythonaultEffect; pointer remains empty. the address remains at 0x000000
below is my 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;
}
};
below is the implementation
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;
}
My directx Device does work. My effect.fx file is in the same folder as my solution files (.cpp and header files)
[edit]
I tried putting effect.fx in the same folder as the executable too
I've been messing around with some other code I have that works. I did not know this but it appears that the layout of .fx file can effect whether I upload the file successfully or not. So I provided my effect code as well
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()));
}
}
Figured it out
SetVertexShader(CompileShader(vs_4_0, VS()));
SetPixelShader(CompileShader(ps_4_0, PS()));
should be
SetVertexShader(CompileShader(vs_4_0, DefaultVS()));
SetPixelShader(CompileShader(ps_4_0, DefaultPS()));
in result. buggy HLSL code can cause D3DX10CreateEffectFromFile to fail.
精彩评论