PMG

Форумы по созданию игр
Текущее время: 21 сен 2017 00:07

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Проблемы с текстурами
СообщениеДобавлено: 06 сен 2007 19:54 
Не в сети
Новичок

Зарегистрирован: 30 авг 2007 19:31
Сообщения: 3
Помогите пожалуйста, не выводит текстуры на экран !?!?!?!?

Вот листинг:

#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;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2007 08:41 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
Объект попадает в камеру?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 сен 2007 19:14 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 30 авг 2007 01:36
Сообщения: 39
Откуда: подвал
Люди добрые, помогите советом. Недавно обнаружил, что функция

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.Какие текстуры вы используете и что мне выбрать?

Заранее спасибо!

_________________
Да прибудет с тобой инкапсуляция и полиморфизм.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 сен 2007 09:56 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
1. Хрен его знает, надо смотреть на сайте ati или nvidia.

Если у тебя текстура не кратна 2, то запихивай ее в текстуру кратную двум, лишь бы по размеру входила, но не с маштабированием, а просто от левого верхнего угла, тогда можно будет по координатам в большой текстуре кратной 2, обратиться к меньшей, которая не кратна 2. Вообще люди делают так берут одну большую текстуру и в нее пихают много маленьких.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 сен 2007 16:10 
Не в сети
Любитель

Зарегистрирован: 19 сен 2007 02:54
Сообщения: 38
Вообще использование текстур не кратных степени двойки приводит к понижению производительности, такчто лучше не стоит их юзать...

Jony_Mnemonic,
попробуй вот эту строчку:
Код:
pDirect3DDevice -> SetTexture(0, pTextura1);

написать перед этой:
Код:
pDirect3DDevice -> SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX));

_________________
c++ foreva!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 сен 2007 19:09 
Не в сети
Новичок

Зарегистрирован: 30 авг 2007 19:31
Сообщения: 3
_dex_, не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 сен 2007 21:50 
Не в сети
Любитель

Зарегистрирован: 19 сен 2007 02:54
Сообщения: 38
Jony_Mnemonic,
проверь, что возвращает эта строчка:
Код:
D3DXCreateTextureFromFile(pDirect3DDevice, "text1.jpg", &pTextura1);

_________________
c++ foreva!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 окт 2007 17:34 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 30 авг 2007 01:36
Сообщения: 39
Откуда: подвал
Все, разобрался с этими ужасными текстурами. А текстуры не в степени 2 нужны для GUI (квадратные кнопки не очень красиво смотрятся).

_________________
Да прибудет с тобой инкапсуляция и полиморфизм.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2007 12:41 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
Помещай, текстуры не в степени 2 в большие по размеры текстуры степени 2, а потом просто выводи прямоугольник, в который вписывай только ту часть текстуры, которую надо выводить.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB