PMG http://forum.pmg.org.ru/ |
|
Проблемы с текстурами http://forum.pmg.org.ru/viewtopic.php?f=2&t=4132 |
Страница 1 из 1 |
Автор: | Jony_Mnemonic [ 06 сен 2007 19:54 ] |
Заголовок сообщения: | Проблемы с текстурами |
Помогите пожалуйста, не выводит текстуры на экран !?!?!?!? Вот листинг: #include <windows.h> #include <d3d9.h> #include <d3dx9.h> #include <conio.h> #include <stdio.h> #include <iostream.h> LPDIRECT3D9 pDirect3D = NULL; LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; LPDIRECT3DTEXTURE9 pTextura1 = NULL; struct CUSTOMVERTEX { FLOAT x, y, z,rhw;; FLOAT tu,tv; }; HRESULT InitialDirect3D(HWND hwnd) { if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; D3DDISPLAYMODE Display; if (FAILED(pDirect3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display))) return E_FAIL; D3DPRESENT_PARAMETERS Direct3DParametr; ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr)); Direct3DParametr.Windowed = FALSE; Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD; Direct3DParametr.BackBufferFormat = Display.Format; Direct3DParametr.BackBufferWidth = 1024;//GetSystemMetrics(SM_CXSCREEN); Direct3DParametr.BackBufferHeight = 768;//GetSystemMetrics(SM_CYSCREEN); Direct3DParametr.BackBufferCount = 3; Direct3DParametr.FullScreen_RefreshRateInHz = Display.RefreshRate; if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice))) return E_FAIL; return S_OK; } HRESULT InitialBufferVershin() { CUSTOMVERTEX Vershin[] = { {1,1,0.0f, 1.0f, 0, 1}, {1,768,0.0f, 1.0f, 1, 1}, {1024, 0.0f, 1.0f, 0, }, {1,768,0.0f, 1.0f, 1, 0}, {1024,768,0.0f, 1.0f, 0, 0}, {1024, 1,0.0f, 1.0f, 1, 1}, }; D3DXCreateTextureFromFile(pDirect3DDevice, "text1.jpg", &pTextura1); if (FAILED(pDirect3DDevice -> CreateVertexBuffer(6*sizeof(CUSTOMVERTEX), 0, D3DFVF_XYZRHW|D3DFVF_TEX1, D3DPOOL_DEFAULT, &pBufferVershin, NULL))) return E_FAIL; VOID* pBV; if (FAILED(pBufferVershin -> Lock(0, sizeof(Vershin), (void**)&pBV, 0))) return E_FAIL; memcpy(pBV, Vershin, sizeof(Vershin)); pBufferVershin -> Unlock(); return S_OK; } VOID RenderingDirect3D() { InitialBufferVershin(); if (pDirect3DDevice == NULL) return; pDirect3DDevice -> Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(88,88,5), 1.0f,0); pDirect3DDevice -> BeginScene(); pDirect3DDevice -> SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX)); pDirect3DDevice -> SetFVF(D3DFVF_XYZRHW|D3DFVF_TEX1); pDirect3DDevice -> SetTexture(0, pTextura1); pDirect3DDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); pDirect3DDevice -> EndScene(); pDirect3DDevice -> Present(NULL, NULL, NULL, NULL); } VOID DeleteDirect3D() { if (pTextura1 != NULL) pTextura1 -> Release(); if (pBufferVershin != NULL) pBufferVershin -> Release(); if (pDirect3DDevice != NULL) pDirect3DDevice -> Release(); if (pDirect3D != NULL) pDirect3D -> Release(); } LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch(msg) { case WM_KEYDOWN: { if (wparam == VK_ESCAPE) PostQuitMessage(0); return 0; } case WM_DESTROY: { DeleteDirect3D(); PostQuitMessage(0); return(0); } } return (DefWindowProc(hwnd, msg, wparam, lparam)); } int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX windowsclass; HWND hwnd; MSG msg; windowsclass.cbSize = sizeof(WNDCLASSEX); windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW; windowsclass.lpfnWndProc = MainWinProc; windowsclass.cbClsExtra = 0; windowsclass.cbWndExtra = 0; windowsclass.hInstance = hinstance; windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW); windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); windowsclass.lpszMenuName = NULL; windowsclass.lpszClassName = "WINDOWSCLASS"; windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&windowsclass)) return(0); if (!(hwnd = CreateWindowEx(NULL,"WINDOWSCLASS","Direct3D",WS_OVERLAPPEDWINDOW|WS_VISIBLE,1,1,800,600,NULL,NULL,hinstance,NULL))) return(0); if (SUCCEEDED(InitialDirect3D(hwnd))) { if (SUCCEEDED(InitialBufferVershin())) { ShowWindow(hwnd, SW_SHOWDEFAULT); UpdateWindow(hwnd); ZeroMemory(&msg, sizeof(msg)); while (msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else RenderingDirect3D(); } } } return 0; } |
Автор: | MagicWolf [ 07 сен 2007 08:41 ] |
Заголовок сообщения: | |
Объект попадает в камеру? |
Автор: | GameX32 [ 20 сен 2007 19:14 ] |
Заголовок сообщения: | |
Люди добрые, помогите советом. Недавно обнаружил, что функция if (FAILED(D3DXCreateTextureFromFileEx(Device, Filename, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, Format, D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE, D3DX_DEFAULT, Transparent, NULL, NULL, &m_Texture))) return FALSE; в случае применения D3DX_DEFAULT в параметрах для длинны и высоты масштабирует текстуру до размеров кратных 2. Так же существует флаг D3DX_DEFAULT_NONPOW2, но для него необходима аппаратная поддержка (можно посмотреть в Caps view из SDK). В связи с этим хочу спросить следуещее: 1.Какие из современных видеокарт поддерживают этот флаг? 2.Если ли поддержка NONPOW2 текстур в DX10? 3.Какие текстуры вы используете и что мне выбрать? Заранее спасибо! |
Автор: | MagicWolf [ 21 сен 2007 09:56 ] |
Заголовок сообщения: | |
1. Хрен его знает, надо смотреть на сайте ati или nvidia. Если у тебя текстура не кратна 2, то запихивай ее в текстуру кратную двум, лишь бы по размеру входила, но не с маштабированием, а просто от левого верхнего угла, тогда можно будет по координатам в большой текстуре кратной 2, обратиться к меньшей, которая не кратна 2. Вообще люди делают так берут одну большую текстуру и в нее пихают много маленьких. |
Автор: | _dex_ [ 22 сен 2007 16:10 ] |
Заголовок сообщения: | |
Вообще использование текстур не кратных степени двойки приводит к понижению производительности, такчто лучше не стоит их юзать... Jony_Mnemonic, попробуй вот эту строчку: Код: pDirect3DDevice -> SetTexture(0, pTextura1); написать перед этой: Код: pDirect3DDevice -> SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX));
|
Автор: | Jony_Mnemonic [ 30 сен 2007 19:09 ] |
Заголовок сообщения: | |
_dex_, не работает. |
Автор: | _dex_ [ 30 сен 2007 21:50 ] |
Заголовок сообщения: | |
Jony_Mnemonic, проверь, что возвращает эта строчка: Код: D3DXCreateTextureFromFile(pDirect3DDevice, "text1.jpg", &pTextura1);
|
Автор: | GameX32 [ 20 окт 2007 17:34 ] |
Заголовок сообщения: | |
Все, разобрался с этими ужасными текстурами. А текстуры не в степени 2 нужны для GUI (квадратные кнопки не очень красиво смотрятся). |
Автор: | MagicWolf [ 22 окт 2007 12:41 ] |
Заголовок сообщения: | |
Помещай, текстуры не в степени 2 в большие по размеры текстуры степени 2, а потом просто выводи прямоугольник, в который вписывай только ту часть текстуры, которую надо выводить. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |