Форум программистов, компьютерный форум, киберфорум
Наши страницы

DirectX

Войти
Регистрация
Восстановить пароль
 
Misha_prog
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 184
#1

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

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

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

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

Фон во весь блок, текст по центру - HTML, CSS
Подскажите как растягивать картинку-фон во весь блок в зависимости от размера экрана? <div class="container-default block-1"> ...

Динамичное облако тегов на весь фон - Web
Всем здрасьте! Хочу на сайт с небольшим количеством таблиц динамичный фон из "плавающих" текстовых строк разного масштаба, которые...

Как растянуть картинку на весь фон экрана - HTML, CSS
Есть картинка со своей высотой меньшей высоты экрана. У меня получается ее повторить по repeat-x и repeat-y. В итоге она три раза...

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

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

6
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
07.09.2014, 03:14 #2
пересоздать рендер таргет при возникновении сообщения WM_SIZE
1
Misha_prog
0 / 0 / 0
Регистрация: 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 / 0
Регистрация: 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 / 0
Регистрация: 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
Привет! Вот еще темы с ответами:

AS 3.0 Как заполнить весь фон swf одной картинкой 15Х15 - ActionScript
Люди помогите! Перерыл весь интернет, не смог найти ответ. Есть маленькое растровое изображение типа 15Х15, необходимо этим...

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

.NET 4.x Во весь экран. - C#
Как сделать так чтобы когда я убирал у формы стиль (кнопки закрыть, развернуть ...) при создании собственной кнопки развернуть форма...

на весь экран - Visual Basic
Всем привет! Есть вопрос как сделать чтобы когда форму при запуске делаешь на весь экран ,так же на весь экран увеличивались и остальные...


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

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

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