Shader无效指针

zyfu0000 2008-10-20 06:02:35
在作着色器的时候定义了
D3DXHANDLE g_ViewProHandle;

在设置着色器的时候令:
g_ViewProHandle=g_pConstantTable->GetConstantByName(NULL,"g_view_proj_matrix");
其中ID3DXConstantTable* g_pConstantTable;

但在渲染函数里的
g_pConstantTable->SetMatrix(g_pD3DDEVICE, g_ViewProHandle, &view_proj_matrix);
提示g_ViewProHandle错误的指针。怎么回事?高手进阿!!
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
引力场变动源 2008-10-23
  • 打赏
  • 举报
回复
Effect框架的确很不错吧^^
zyfu0000 2008-10-22
  • 打赏
  • 举报
回复
那怎么办,没用也没事,我用Effect框架写出来了,感觉用Effect框架更简单了,要再学一点。
引力场变动源 2008-10-22
  • 打赏
  • 举报
回复
可以确定是着色器文件出的问题了,我刚刚用DX SDK自带的HLSLwithoutEffects.vsh测试了一下,一切正常,但是换成你的那个着色器,就出现错误了。
不过错误的原因还不清楚,怀疑可能是文字编码上的问题,因为在测试中发生了一些奇怪的问题,比如明明都是英文字母,Ansi编码和UTF-8编码应该是等价的,可是转成UTF-8编码后却会出现编译错误,找不到指定名称之类的,再转回Ansi编码的话,虽然错误没有了,但是又不能获得变量的句柄了。
引力场变动源 2008-10-21
  • 打赏
  • 举报
回复
会不会是着色器编译出错?
zyfu0000 2008-10-21
  • 打赏
  • 举报
回复
vertexshader.cxx:

const vector RED={1.0f,0.0f,0.0f,1.0f};
matrix viewprojmatrix;
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,viewprojmatrix);
output.diffuse=RED;
return output;
}

main.cpp:
#include <d3dx9.h>


#define WIN32_LEAN_AND_MEAN
#define SafeRelease(object) {if (object!=NULL) {object->Release();object=NULL;}}

D3DXHANDLE g_ViewProHandle=0;
LPDIRECT3DDEVICE9 g_pD3DDEVICE;
LPD3DXMESH g_pTeapot;
IDirect3DVertexShader9* g_pVertexShader;
ID3DXConstantTable* g_pConstantTable=NULL;
D3DXMATRIX g_ProjMatrix;


HRESULT InitD3D( HWND hwnd )
{
IDirect3D9* d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if(d3d9 == NULL)
{
MessageBox(NULL, "Direct3DCreate9() - failed.", NULL, MB_OK);
return false;
}

D3DDISPLAYMODE ddpm;
if (FAILED(d3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddpm)))
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 = ddpm.Format;
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_pConstantTable->SetDefaults(g_pD3DDEVICE);
D3DXMatrixPerspectiveFovLH(&g_ProjMatrix,D3DX_PI/3,1,1.0f,1000.0f);
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_pConstantTable->GetConstantByName(NULL,"viewprojmatrix"),&view_proj_matrix);
g_pD3DDEVICE->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
return true;
}

void Render()
{
g_pD3DDEVICE->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 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()
{
SafeRelease(g_pD3DDEVICE);
SafeRelease(g_pConstantTable);
SafeRelease(g_pVertexShader);
SafeRelease(g_pTeapot);
}
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;
}
Silenker 大哥有劳了!!
zyfu0000 2008-10-21
  • 打赏
  • 举报
回复
肯定做了,但不晓得为什么就是有错,郁闷阿
引力场变动源 2008-10-21
  • 打赏
  • 举报
回复
你把程序发给我看一下看。
zyfu0000 2008-10-21
  • 打赏
  • 举报
回复
什么意思啊Silenker 大哥,如果是那要怎么解决呢?
引力场变动源 2008-10-20
  • 打赏
  • 举报
回复
^^
其实两者是一个东西,不过D3DXEffect用起来更加方便一点,你现在学的就好比是Win32 API,D3DXEffect就好比是MFC。

直接用shader的话,一般是下面这个步骤:
D3DXCompileShaderFromFile()或者from其它地方
CreateVertexShader();//这一步做了吗?

渲染的时候:
pd3dDevice->SetVertexShader();

然后向着色器传递数据的时候试试直接传递看看:
g_pConstantTable->SetMatrix(g_pD3DDEVICE, "g_view_proj_matrix", &view_proj_matrix);
zyfu0000 2008-10-20
  • 打赏
  • 举报
回复
没有 写错啊 很奇怪啊 我才刚学嘛 那个等弄懂一些再说。
引力场变动源 2008-10-20
  • 打赏
  • 举报
回复
可能着色器文件中没有g_view_proj_matrix这个变量吧,你看一下变量的名字有没有写错。

然后着色器的话,我觉得使用D3DX库提供的D3DXEffect更加方便一些,这个类可以方便的使用fx效果框架文件。
fx效果框架文件是多着色器的高级封装,可以同时编写顶点着色器和像素着色器的代码,并且可以在文件中直接设置D3D设备的状态,非常方便。
参考资料:
http://www.cnblogs.com/microsoftxiao/archive/2006/06/24/434916.html
http://blog.csdn.net/xoyojank/archive/2007/05/18/1614257.aspx
linjacky 2008-10-20
  • 打赏
  • 举报
回复
关注中……帮你顶!!

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧