一个着色器中提示无效指针:
vertexshader.cxx:
matrix g_view_proj_matrix;
const vector RED={1.0f,0.0f,0.0f,1.0f};struct sVertexInput
{
vector position:POSITION;
};struct sVertexOutput
{
vector position:POSITION;
vector diffuse:COLOR;
};sVertexOutput main(sVertexInput input)
{
sVertexOutput output=(sVertexOutput)0;
output.position=mul(output.position,g_view_proj_matrix);
output.diffuse=RED;
return output;
}
main.cpp:
#include <d3dx9.h>
#include <d3d9.h>
#include <d3dx9shader.h>
#pragma warning(disable : 4100)
#pragma warning(disable : 4819)
#define SafeRelease(object) {if (object!=NULL) {object->Release();object=NULL;}}
LPDIRECT3DDEVICE9 g_pD3DDEVICE;
LPD3DXMESH g_pTeapot;
IDirect3DVertexShader9* g_pVertexShader;
ID3DXConstantTable* g_pConstantTable;
D3DXMATRIX g_ProjMatrix;
D3DXHANDLE g_ViewProHandle;HRESULT InitD3D( HWND hwnd )
{
IDirect3D9* d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if(d3d9 == NULL)
{
MessageBox(NULL, "Direct3DCreate9() - failed.", NULL, MB_OK);
return false;
} // step 2: check for hardware vertex presentation.

D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // step 3: fill out the D3DPRESENT_PARAMETERS structure. D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // step 4: create the device. if(FAILED(d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pD3DDEVICE)))
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; if(FAILED(d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pD3DDEVICE)))
{
d3d9->Release(); // done with d3d9 object
MessageBox(NULL, "CreateDevice() - failed.", NULL, MB_OK);
return false;
}
} d3d9->Release(); // done with d3d9 object
return true;
}
HRESULT InitDot()
{
D3DXCreateTeapot(g_pD3DDEVICE,&g_pTeapot,NULL);
ID3DXBuffer* errorbuffer;
ID3DXBuffer* shaderbuffer;
HRESULT hr=D3DXCompileShaderFromFile("VertexShader.cxx",NULL,NULL,"main","vs_1_1",D3DXSHADER_DEBUG,&shaderbuffer,&errorbuffer,&g_pConstantTable);
if (errorbuffer)
{
MessageBox(NULL,(char*)errorbuffer->GetBufferPointer(),"ERROR",MB_OK);
SafeRelease(errorbuffer);
}
if(FAILED(hr))
{
MessageBox(NULL, "D3DXCreateEffectFromFile() - FAILED", "ERROR", MB_OK);
return false;
}
hr=g_pD3DDEVICE->CreateVertexShader((DWORD*)shaderbuffer->GetBufferPointer(),&g_pVertexShader);
if(FAILED(hr))
{
MessageBox(NULL, "CreateVertexShader - FAILED", "ERROR", MB_OK);
return false;
}
SafeRelease(shaderbuffer);
g_ViewProHandle=g_pConstantTable->GetConstantByName(NULL,"g_view_proj_matrix");
g_pConstantTable->SetDefaults(g_pD3DDEVICE);
D3DXMatrixPerspectiveFovLH(&g_ProjMatrix,D3DX_PI/4,1,1.0f,1000.0f);
g_pD3DDEVICE->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
return true;
}
void Render()
{
D3DXVECTOR3 position( 10.0f, 100,10.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX view_matrix;
D3DXMatrixLookAtLH(&view_matrix, &position, &target, &up);
D3DXMATRIX view_proj_matrix = view_matrix * g_ProjMatrix;
g_pConstantTable->SetMatrix(g_pD3DDEVICE, g_ViewProHandle, &view_proj_matrix);
    g_pD3DDEVICE->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
    g_pD3DDEVICE->BeginScene();
    g_pD3DDEVICE->SetVertexShader(g_pVertexShader);;
    g_pTeapot->DrawSubset(0);
    g_pD3DDEVICE->EndScene();
    g_pD3DDEVICE->Present( NULL, NULL, NULL, NULL );
}
void ClearUp()
{
if (g_pD3DDEVICE!=NULL)
g_pD3DDEVICE->Release();
}
LRESULT CALLBACK MsgProc(
HWND hWnd, 
UINT uMsg, 
WPARAM wParam, 
LPARAM lParam 
)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;

}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int  WINAPI WinMain(
HINSTANCE hInstance, 
HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, 
int nShowCmd 
)
{
WNDCLASSEX wndclass={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"D3D Tutorial",NULL};
RegisterClassEx(&wndclass);
HWND hwnd=CreateWindow("D3D Tutorial","SoftStar",WS_OVERLAPPEDWINDOW,100,100,640,480,GetDesktopWindow(),NULL,wndclass.hInstance,NULL);
if (SUCCEEDED(InitD3D(hwnd)))
{
if (SUCCEEDED(InitDot()))
{
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
   ZeroMemory( &msg, sizeof(msg) );
            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE))
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    Render();
            }
}
}
ClearUp();
UnregisterClass("D3D Tutorial",wndclass.hInstance);
return 0;
}提示在render()函数里g_pConstantTable->SetMatrix(g_pD3DDEVICE, g_ViewProHandle, &view_proj_matrix);
句中的g_ViewProHandle是无效指针,怎么回事啊,高手进阿。