
Опытный
 
Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва
Репутация: нет Всего: нет
|
Занимаюсь по книге про DirectX Книга рассчитана на Visual С++ 6 какжется, у меня 2005. Суть вот в чем. Описывается загрука простейшей модели с текстурой из файла .x и .bmp соответсвенно и отображение её на экране. У меня почемуто вместо поверхности отображается только сетка(. подскажите плз. код для занющих вроде простой И ещё . странный эфект . такое чуство что когда часть сетки образующей модель попадает в освещённую область-она становитс цвета текстуры вместо черного. | Код | //Загрука модели DWORD LoadMesh (IDirect3DDevice9 *D3Dc,ID3DXMesh **mesh,LPDIRECT3DTEXTURE9 **tex,D3DMATERIAL9 **mat){ LPD3DXBUFFER mtrlBuf; DWORD nMr;
D3DXLoadMeshFromX (TEXT("m.x"),D3DXMESH_SYSTEMMEM,D3Dc,NULL,&mtrlBuf,NULL,&nMr,mesh); D3DXMATERIAL* pmat=(D3DXMATERIAL*)mtrlBuf->GetBufferPointer();
(*mat)=new D3DMATERIAL9[nMr]; (*tex)=new LPDIRECT3DTEXTURE9[nMr];
for (DWORD i=0;i<nMr;i++){ (*mat)[i]=pmat[i].MatD3D; if(FAILED(D3DXCreateTextureFromFile(D3Dc,LPCWSTR(pmat[i].pTextureFilename),&(*tex)[i]))) if(FAILED(D3DXCreateTextureFromFile(D3Dc,TEXT("t.bmp"),&(*tex)[i]))) tex[i]=NULL; } return nMr; }
//Установака камеры ,света. d3dc это объект типа Direcr3DDevice9 D3DLIGHT9 light; ZeroMemory(&light,sizeof(D3DLIGHT9)); light.Type=D3DLIGHT_DIRECTIONAL; light.Direction=D3DXVECTOR3(0.1f,0.1f,0.5f); light.Diffuse.a= light.Diffuse.r= light.Diffuse.g= light.Diffuse.b=1.0f; d3dc->SetLight(0,&light); d3dc->LightEnable(0,TRUE); D3DMATRIX View={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,500,1}; d3dc->SetTransform(D3DTS_VIEW,&View);
//Вывод на экран d3dc->Clear(1,(D3DRECT*)&r,D3DCLEAR_TARGET,D3DCOLOR_XRGB(200,255,255),1.0,0); d3dc->BeginScene();
d3dc->SetRenderState(D3DRS_LIGHTING,TRUE); for(DWORD i=0;i<dnm;i++){ d3dc->SetMaterial (&Mat[i]); if(Tex[i]) d3dc->SetTexture(i,Tex[i]); Mesh->DrawSubset(i);
d3dc->EndScene(); d3dc->Present(NULL,NULL,0,NULL);
}
|
Инициализаций DIrect 3d: она по идее должна быть правильной, т.к. собранй вручную(по кординатам) куб отображается нормально и в цвете | Код |
HRESULT MinitDX3D(IDirect3D9 **dirx9,IDirect3DDevice9 **dirxdev9,HWND wind,DWORD w,DWORD h,BOOL full){ if((*dirx9=Direct3DCreate9(D3D9b_SDK_VERSION))==NULL) return E_FAIL; D3DPRESENT_PARAMETERS d3param; ZeroMemory(&d3param,sizeof(d3param));
d3param.BackBufferWidth=w; d3param.BackBufferHeight=h; int full_res; if(!full){ full_res=MessageBox(hWnd,TEXT("FULL?"),TEXT("full screen"),MB_YESNO|MB_ICONQUESTION); }else{ full_res=IDYES; } if(full_res==IDYES){ d3param.BackBufferFormat=D3DFMT_R5G6B5; d3param.SwapEffect=D3DSWAPEFFECT_FLIP; d3param.Windowed=FALSE; d3param.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT; d3param.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT; }else{ RECT wndRect; RECT clientRect; GetWindowRect(hWnd,&wndRect); GetClientRect(hWnd,&clientRect);
int iW=w+(wndRect.right-wndRect.left)-(clientRect.right-clientRect.left); int iH=h+(wndRect.bottom-wndRect.top)-(clientRect.bottom-clientRect.top); MoveWindow(hWnd,wndRect.left,wndRect.top,iW,iH,TRUE); D3DDISPLAYMODE d3disp; (*dirx9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3disp);
d3param.BackBufferFormat=d3disp.Format; d3param.SwapEffect=D3DSWAPEFFECT_DISCARD; d3param.Windowed=TRUE; } DWORD Flags=D3DCREATE_MIXED_VERTEXPROCESSING|D3DCREATE_MULTITHREADED;
HRESULT hRes; if(FAILED(hRes=(*dirx9)->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,Flags,&d3param,dirxdev9))) return hRes; float Aspect = (float)d3param.BackBufferWidth/(float)d3param.BackBufferHeight; D3DXMATRIX matProg; D3DXMatrixPerspectiveFovLH(&matProg,D3DX_PI/4.0f,Aspect,0.1f,1000.0f); (*dirxdev9)->SetTransform(D3DTS_PROJECTION,&matProg); (*dirxdev9)->SetRenderState(D3DRS_LIGHTING, FALSE); return S_OK; }
|
Это сообщение отредактировал(а) ano360 - 28.12.2007, 16:44
--------------------
Жизнь есть.
|