Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мультитекстурирование... как это делается?! Мультитекстурирование... как это делаетс 
V
    Опции темы
ZC1989
Дата 13.9.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Всем читателям, Привет!

Подскажите, лучше всего примером, как в дирексте выводить несколько примитивов одновременно, с разными текстурами… я загрузил их, но не знаю как присваивать, у меня структура вершин на это не рассчитана, а как это сделать?!

Вот то что у меня щас творится там:

Код

#define MOTION_VERTEX_FORMAT (D3DFVF_XYZRHW | D3DFVF_TEX1) // Формат вершин

// Структура
struct MOTION_VERTEX
{
    D3DXVECTOR4 p; // Координаты вершины
    D3DXVECTOR2 t; // Координаты текстуры
};

MOTION_VERTEX* verticesBG;

…// соб-сно рендеринг (рендерю в каждом кадре, что бы объекты у меня двигались:)
// ФОН МЕНЮ
    verticesBG[0].p = D3DXVECTOR4(0.0f, 0.0f, 0.0f, 1.0f);
    verticesBG[0].t = D3DXVECTOR2(0, 0);

    verticesBG[1].p = D3DXVECTOR4(MenuWidth, 0.0f, 0.0f, 1.0f);
    verticesBG[1].t = D3DXVECTOR2(1, 0);

    verticesBG[2].p = D3DXVECTOR4(0.0f, MenuHeight, 0.0f, 1.0f);
    verticesBG[2].t = D3DXVECTOR2(0, 1);

    verticesBG[3].p = D3DXVECTOR4(MenuWidth, MenuHeight, 0.1f, 1.0f);
    verticesBG[3].t = D3DXVECTOR2(1, 1);

    verticesBG[4].p = D3DXVECTOR4(0.0f, MenuHeight, 0.1f, 1.0f);
    verticesBG[4].t = D3DXVECTOR2(0, 1);

    verticesBG[5].p = D3DXVECTOR4(MenuWidth, 0.0f, 0.1f, 1.0f);
    verticesBG[5].t = D3DXVECTOR2(1, 0);

// КУРСОР
    verticesBG [6].p = D3DXVECTOR4((float)MouseMenuX, (float)MouseMenuY, 0.0f, 1.0f);
    verticesBG [6].t = D3DXVECTOR2(0, 0);

    verticesBG [7].p = D3DXVECTOR4((float)MouseMenuX+50, (float)MouseMenuY, 0.0f, 1.0f);
    verticesBG [7].t = D3DXVECTOR2(1, 0);
        
    verticesBG [8].p = D3DXVECTOR4((float)MouseMenuX, (float)MouseMenuY+50, 0.0f, 1.0f);
    verticesBG [8].t = D3DXVECTOR2(0, 1);


    pDevice -> SetTexture(0, pTextureMenu[1]);
    pDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pDevice -> SetRenderState(D3DRS_LIGHTING, 0);
    pDevice -> SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
    pDevice -> SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
    
    pDevice -> SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    pDevice -> SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    // Отрисовка треугольника.
    pDevice -> SetFVF(MOTION_VERTEX_FORMAT);
    pDevice -> SetStreamSource(0, pVertexBMenu, 0, sizeof(MOTION_VERTEX));

    pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3);

…

int InitVB() // инициализация  вершинного буфера
{
    D3DXCreateTextureFromFile(pDevice, ".\\texture\\menu.jpg", &pTextureMenu[1]);
    D3DXCreateTextureFromFile(pDevice, ".\\texture\\cursor.jpg";, &pTextureMenu[2]);

    // Создаем вершиный буфер.
    pDevice -> CreateVertexBuffer(9*sizeof(MOTION_VERTEX), D3DUSAGE_POINTS, MOTION_VERTEX_FORMAT, D3DPOOL_DEFAULT, &pVertexBMenu, NULL );


    // Заполнение вершинного буфера данными.
    pVertexBMenu -> Lock(0, 9, (void**)&verticesBG, 0 );
    pVertexBMenu -> Unlock();

    return 0;
}


в общем, мне надо написать движок меню игры… идеологию я понимаю… но вот сначала решил попробовать примитивно всё это описать, как видите, ничего не получилось…

как к части массива КУРСОР присваивать собственную текстуру?! Пробовал  делать два массива verticesBG и verticesCur результат был нулевой… точнее, вообще всё съехало…надо что-то радикально, а я понятия не имею что… 



--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
empter
Дата 13.9.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фанат
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 20.5.2005

Репутация: 3
Всего: 4



У тебя создан один обьект.
Надо для каждого, т.е курсора и фона создавать свой вершинный буфер, а затем 
их подряд рисовать

   
Код

    // рисуем меню
    pDevice -> SetTexture(0, pTextureMenu[1]);
    pDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pDevice -> SetRenderState(D3DRS_LIGHTING, 0);
    pDevice -> SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
    pDevice -> SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
    
    pDevice -> SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    pDevice -> SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    // Отрисовка треугольника.
    pDevice -> SetFVF(MOTION_VERTEX_FORMAT);
    pDevice -> SetStreamSource(0, pVertexBMenu, 0, sizeof(MOTION_VERTEX));
    pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3);
    
    // рисуем курсор
    pDevice -> SetTexture(0, pTextureСursor[1]);
    pDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pDevice -> SetRenderState(D3DRS_LIGHTING, 0);
    pDevice -> SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
    pDevice -> SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
    
    pDevice -> SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    pDevice -> SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    // Отрисовка треугольника.
    pDevice -> SetFVF(MOTION_VERTEX_FORMAT);
    pDevice -> SetStreamSource(0, pVertexBCursor, 0, sizeof(MOTION_VERTEX));
    pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3);

PM MAIL MSN   Вверх
ZC1989
Дата 13.9.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



empter, спасибо! наконей-то заработало!!! НО! получается что для каждого объекта необходимо создавать совй вершинный буффер?! разве это рационально?!  smile хотя, если писать класс объекта, то нормально получаться должно... спасибо, ещй раз, буду наконец-то писать дальше...


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
empter
Дата 13.9.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фанат
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 20.5.2005

Репутация: 3
Всего: 4



Цитата(ZC1989 @  13.9.2006,  17:53 Найти цитируемый пост)
НО! получается что для каждого объекта необходимо создавать совй вершинный буффер?! 

Да, когда обьектов не много это не мешает, а при увеличении обьектов которые надо рисовать
встает проблема оптимизации (не рисовать обьекты, которые не видны в камере, обьединить
вершинные буферы нескольких обьектов в один и т.д) но это уже отдельная тема.
PM MAIL MSN   Вверх
ZC1989
Дата 14.9.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



да, вопросов щас уже больше чем достаточно, но некоторые решаю сам, а те что не получается, спрашиваю у вас... smile 

да, вот в продолжение текстурирования: нужно использовать альфа анал, сейчас хватает Дирекстовых файлов .dds, но, этого будет только для меню достаточно, а как сделать что бы альфой была текстуа так же загруженная? что для этого надо? smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
empter
Дата 14.9.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фанат
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 20.5.2005

Репутация: 3
Всего: 4



Ну на фиксированном конвейере это будет выглядеть примерно так
Код


    pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

    pD3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    pD3DDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
    pD3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    pD3DDevice->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);

    pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    g_pD3DDevice->SetTexture(0, m_pAlphaLev1);                                
    g_pD3DDevice->SetTexture(1, m_pTexLev1);
    
    pDevice -> SetFVF(MOTION_VERTEX_FORMAT);
        pDevice -> SetStreamSource(0, pVertexBCursor, 0, sizeof(MOTION_VERTEX));
        pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3);

PM MAIL MSN   Вверх
ZC1989
Дата 14.9.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



empter, ага..спасибо! буду юзать!  smile


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.