Форум программистов, компьютерный форум, киберфорум
Наши страницы
DirectX
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Misha_prog
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
#1

Фон на весь экран

06.09.2014, 20:15. Просмотров 537. Ответов 6
Метки нет (Все метки)

Всем привет!!!! Хочу сделать фон на весь экран приложения, вот и чтоб при ресайзе фон подстраивался под новый размер окна. Не подскажите как это сделать ?
всем спасибо за внимание!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2014, 20:15
Ответы с готовыми решениями:

Direct3D растянуть меш на весь экран
Всем привет! Проблема в том, что я столкнулся с проблемой в матричных...

Фон во весь блок, текст по центру
Подскажите как растягивать картинку-фон во весь блок в зависимости от размера...

Динамичное облако тегов на весь фон
Всем здрасьте! Хочу на сайт с небольшим количеством таблиц динамичный фон из...

Как растянуть картинку на весь фон экрана
Есть картинка со своей высотой меньшей высоты экрана. У меня получается ее...

Сложный background или фон-градиент не на весь блок
Доброго времени суток, уважаемые форумчане! Столкнулся с проблемой в...

6
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
07.09.2014, 03:14 #2
пересоздать рендер таргет при возникновении сообщения WM_SIZE
1
Misha_prog
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
07.09.2014, 09:31  [ТС] #3
Спасибо за помощь! А не могли бы вы ещё подсказать как фон "по-умному" растянуть на весь экран, а то я просто пытаюсь координаты вершин "подогнать" вот мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
device->CreateVertexBuffer(
        6 * sizeof(Vertex),
        0, // usage
        helper::FVF,
        D3DPOOL_MANAGED,
        &m_vertexBuffer,
        0);
 
    Vertex* v = 0;
    m_vertexBuffer->Lock(0, 0, (void**)&v, 0);
 
    v[0] = Vertex(-2.0f, -2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
    v[1] = Vertex(-2.0f,2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
    v[2] = Vertex(2.0f, 2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
    v[3] = Vertex(-2.0f, -2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
    v[4] = Vertex(2.0f, 2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
    v[5] = Vertex(2.0f, -2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);
 
    m_vertexBuffer->Unlock();
 
    D3DXCreateTextureFromFile(device, "picture.jpg", &m_backGround);
 
    device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
 
    device->SetRenderState(D3DRS_LIGHTING, false);
    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
        &proj,
        D3DX_PI * 0.5f, // 90 - degree
        (float)Width / (float)Height,
        1.0f,
        3.0f);
    device->SetTransform(D3DTS_PROJECTION, &proj);
это был этап инициализации, а вот и сам рендер :
C++
1
2
3
4
5
6
7
8
9
10
11
D3DXMATRIX I;
    D3DXMatrixIdentity(&I);
    device->SetTransform(D3DTS_WORLD, &I);
 
    device->SetStreamSource(0, m_vertexBuffer, 0, sizeof(Vertex));
    device->SetFVF(helper::FVF);
 
 
    
    device->SetTexture(0, m_backGround);
    device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
08.09.2014, 04:36 #4
было бы проще подсказать зная что конкретно вам нужно в конце получить. Вобще растянуть спрайт на весь экран можно просто откинуть проэкционную матрицу и установить края от -1 до +1. Т.е. Без домножения на проекцию Директ 3д будет рисовать все в единичном кубе. Или поменять перспективу на орто. При этом нетрогая видовую матрицу(т.е камера 0евая). В принципе тожесамое бы прокатило и в перспективе если установить ближнию плоскость = проэкционной. И далее отодвигая спрайт увеличивать его маштаб по зависимости от растояния , ну это опятьже зависит от того нужно ли это вобще вам. Короче способов много но нужно знать цель.
1
Misha_prog
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
08.09.2014, 21:16  [ТС] #5
Спасибо большое за помощь! На самом деле я просто хочу вывести картинку на весь экран, типа background.
подскажите пожалуйста, как откинуть проэкционную матрицу и установить края от -1 до +1, чтобы картинка на весь экран
вот место где я инициализирую directX
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
WNDCLASS wc;
 
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = ::LoadIcon(0, IDI_APPLICATION);
    wc.hCursor = ::LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = 0;
    wc.lpszClassName = TEXT("2D");
 
    if (!RegisterClass(&wc))
    {
        ::MessageBox(0, TEXT("RegisterClas() - FAILED"), 0, 0);
        return false;
    }
    HWND hwnd;
 
    hwnd = ::CreateWindow(TEXT("2D"), TEXT("Direct3DApp"),
        WS_EX_TOPMOST,
        0, 0, CScene::Width, CScene::Height,
        0 /*parent hwnd*/, 0 /*menu*/, hInstance, 0 /*extra*/);
 
    if (!hwnd)
    {
        ::MessageBox(0, TEXT("CreateWindow() - FAILED"), 0, 0);
        return false;
    }
    RECT rcWindowClient;
 
    GetClientRect(hwnd, &rcWindowClient);
 
    int xOffset = (CScene::Width - (rcWindowClient.right - rcWindowClient.left));
    int yOffset = (CScene::Height - (rcWindowClient.bottom - rcWindowClient.top));
    SetWindowPos(
        hwnd,
        NULL,
        0,                              // X-Pos
        0,                              // Y-Pos
        CScene::Width + xOffset,    // Width
        CScene::Height + yOffset,   // Height
        NULL);
    ::ShowWindow(hwnd, SW_SHOW);
    ::UpdateWindow(hwnd);
 
    //
    // Init D3D
    //
 
    HRESULT hr = 0;
 
    // Шаг 1: Создаем обьект IDIrect3D9
    IDirect3D9* d3d9 = 0;
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
 
    if (!d3d9)
    {
        ::MessageBox(0, TEXT("Direct3dCreare() - FAILED"), 0, 0);
        return false;
    }
 
    // Шаг 2: Проверка аппаратной поддержки обработки вершин
 
    // Заполняем структуру D3DCAPS9 информацией о
    // возможностях первичного видеоадаптера
 
    D3DCAPS9 caps;
    d3d9->GetDeviceCaps(
        D3DADAPTER_DEFAULT, // Означает первичный видеоадаптер
        m_deviceType,         // Задает тип устройства, обыяно D3Dm_device_HAL
        &caps);             // Возвращает заполненую структуру D3DCAPS9, которая содержит
    // информацию о возможностях  первичного видеоадаптера
 
    // Поддерживается аппаратноая обработка вершин?
    int vp = 0;
    if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    {
        // да, сохраняем в vp флаг поддержки аппаратной 
        // обработки вершин
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    }
    else
    {
        // нет, сохраняем в vp флаг использования программной
        // обработки вершин
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    }
 
    // Шаг 3: Заполняем структуру D3DPRESENT_PARAMETERS
 
    D3DPRESENT_PARAMETERS d3dpp;
    d3dpp.BackBufferWidth = CScene::Width;
    d3dpp.BackBufferHeight = CScene::Height;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // Формат пикселей
    d3dpp.BackBufferCount = 1;
    d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE/*D3DMULTISAMPLE_4_SAMPLES*/;
    d3dpp.MultiSampleQuality = 0;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hwnd;
    d3dpp.Windowed = windowed; // режим экрана false - весь экран
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // формат буфера глубины
    d3dpp.Flags = 0;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
 
    // Шаг 4: Создаем устройство
 
    hr = d3d9->CreateDevice(
        D3DADAPTER_DEFAULT, // первичный видеоадаптер
        m_deviceType,         // тип устройства
        hwnd,               // окно, связанное с устройством
        vp,                 // тип обработки вершин
        &d3dpp,             // параметры показа
        &m_device);            // возвращает созданное устройство
 
    if (FAILED(hr))
    {
        d3d9->Release();
        ::MessageBox(0, TEXT("Createm_device() - FAILED"), 0, 0);
        return false;
    }
 
    d3d9->Release();
    m_scene.init(m_device);
    DisplayBack();
    return true;
вот функция init

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
device->CreateVertexBuffer(
        6 * sizeof(Vertex),
        0, // usage
        helper::FVF,
        D3DPOOL_MANAGED,
        &m_vertexBuffer,
        0);
 
    Vertex* v = 0;
    m_vertexBuffer->Lock(0, 0, (void**)&v, 0);
    m_script.setFileName("SceneConfig.lua");
    // floor
    v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
    v[1] = Vertex(-1.0f,2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
    v[2] = Vertex(1.0f, 2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
    v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
    v[4] = Vertex(1.0f, 2.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
    v[5] = Vertex(1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);
 
    m_vertexBuffer->Unlock(); 
    //
    // Load Textures, set filters.
    //
    D3DXCreateTextureFromFile(device, "pic.name", &m_backGround);
    device->SetTexture(0, m_backGround);
    /// делаем фильтрацию так как размер текстуры может не совпадать с размером области на экране
    device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
 
    device->SetRenderState(D3DRS_LIGHTING, false);  // запрещаем освещение
    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
        &proj,
        D3DX_PI * 0.5f, // 90 - degree
        (float)Width / (float)Height,
        //0.5f,
        1.0f,
        1000.0f);
    device->SetTransform(D3DTS_PROJECTION, &proj);
}
вот функция displayBack

C++
1
2
3
4
5
6
7
8
9
10
11
12
if (m_device)
    {
 
 
        m_device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
        m_device->BeginScene();
 
        m_scene.render(m_device);
        
        m_device->EndScene();
        m_device->Present(0, 0, 0, 0);
    }
вот функция render
C++
1
2
3
4
5
6
7
8
9
10
11
D3DXMATRIX I;
    D3DXMatrixIdentity(&I);
    device->SetTransform(D3DTS_WORLD, &I);
 
    device->SetStreamSource(0, m_vertexBuffer, 0, sizeof(Vertex));
    device->SetFVF(helper::FVF);
 
    // draw the floor
    
    device->SetTexture(0, m_backGround);
    device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

то что то вообще я не понимаю как это сделать
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
09.09.2014, 07:03 #6
Если я вам покажу или скажу врятли это вас научит действительно. Вам бы лучше взять книгу или сайт какой.

вот это D3DXMATRIX proj; матрица проекции уберите ее везде из кода.

D3DXMATRIX proj; - обьявление
D3DXMatrixPerspectiveFovLH( - функция создания
&proj,
D3DX_PI * 0.5f, // 90 - degree
(float)Width / (float)Height,
//0.5f,
1.0f,
1000.0f);
device->SetTransform(D3DTS_PROJECTION, &proj); // это ее применение.

вершины должны быть от 1 до -1 и при этом Z вершин от 0 до 1. Иначе фон выйдет за пределы видемой области при вашей 1,25.
1
Misha_prog
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
09.09.2014, 11:23  [ТС] #7
Спасибо большое за помощь!!! да я читаю одну книжку по директX но помимо её, пытаюсь сам себе задания придумывать и их делать , чтобы лучше закрепить знания.
0
09.09.2014, 11:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2014, 11:23

Окно без рамки + фон на весь размер окна
Не знаю что использовать, какие инструменты и т.п. Нужно создать окно...

Как заполнить весь фон swf одной картинкой 15Х15
Люди помогите! Перерыл весь интернет, не смог найти ответ. Есть маленькое...

При включение компа экран моргает а дальше весь экран белый
Здравствуйте.Помогите пожалуйста.При включение компа экран моргает а дальше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru