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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как задать цвет примитиву? DirectX 
:(
    Опции темы
Coocky
Дата 26.7.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Есть код
Код

struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; };
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE )
................
................
.................
CUSTOMVERTEX g_Vertices[] =
{
    {  60.0f,  60.0f, 0.5f, 1.0f, 0xffff0000, },
    { 200.0f,  60.0f, 0.5f, 1.0f, 0xff00ff00, },
    {  60.0f, 200.0f, 0.5f, 1.0f, 0xff0000ff, },

    {  80.0f, 220.0f, 0.5f, 1.0f, 0xff0000ff, },
    { 220.0f,  80.0f, 0.5f, 1.0f, 0xff00ff00, },
    { 220.0f, 220.0f, 0.5f, 1.0f, 0xffffff00, },
};

p_d3d_Device->CreateVertexBuffer (6*sizeof(CUSTOMVERTEX), 0, 
                D3DFVF_CUSTOMVERTEX, 
                D3DPOOL_DEFAULT,
                &p_VertexBuffer);


Все работает, рисуются два треугольничка. Разноцветные.
Теперь попробуем повращать
Для этого (брал из какого-то примера smile ) делаем
Код

struct CUSTOMVERTEX { float x, y, z;};
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ )

и далее......
Все вращается. Но..
Треугольнички черные. Захотел я сделать их разноцветными
Книги нет под рукой, поэтому "навпомыцьки" сделал следующее
Код

struct CUSTOMVERTEX { float x, y, z;DWORD w;};
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ |D3DFVF_SPECULAR )

.......
.......
CUSTOMVERTEX g_Vertices[] =
{
    {  60.0f,  60.0f, 0.5f, 1.0f, 0xffff0000, },
    { 200.0f,  60.0f, 0.5f, 1.0f, 0xff00ff00, },
    {  60.0f, 200.0f, 0.5f, 1.0f, 0xff0000ff, },

    {  80.0f, 220.0f, 0.5f, 1.0f, 0xff0000ff, },
    { 220.0f,  80.0f, 0.5f, 1.0f, 0xff00ff00, },
    { 220.0f, 220.0f, 0.5f, 1.0f, 0xffffff00, },
};

p_d3d_Device->CreateVertexBuffer (6*sizeof(CUSTOMVERTEX), 0, 
                D3DFVF_CUSTOMVERTEX, 
                D3DPOOL_DEFAULT,
                &p_VertexBuffer);


Но банан... smile 
Треугольники все равно черные smile 
Такое подозрение, что я хочу просто халявы, а там со светом, наверное надо еще операции дополнительные сделать. Или материал установить или источник цвета (может бред несу, но говорю чисто интуитивно, так как книг не читал smile ). Не знаю.. Никто не подскажет?

Добавлено @ 13:19 
Т.е, что б уже вообще за идиота не считали, хотел бы спросить-можно ли разукрашивать 3D обьекты без (внимание smile ) света? 


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
ILAgent
Дата 27.7.2006, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Coocky @ 26.7.2006,  13:15)
Т.е, что б уже вообще за идиота не считали, хотел бы спросить-можно ли разукрашивать 3D обьекты без (внимание smile ) света?

Можно. Вот пример с диска, который к книге прилагался.
Код

//-----------------------------------------------------------------------------------
// MatrixKvadrat.CPP 
// Рисуем квадрат
//-----------------------------------------------------------------------------------

#include <windows.h>         // Подключаем заголовочный файл Windows
#include <d3d9.h>            // Подключаем заголовочный файл DirectX 9 SDK
#include <d3dx9.h>           // Подключаем из D3DX утилит для работы с матрицами
#include <mmsystem.h>        // Подключаем системную библеотеку 
//-----------------------------------------------------------------------------------
// Глобальные переменные
//-----------------------------------------------------------------------------------

LPDIRECT3D9                 pDirect3D          = NULL;      // Главный Direct3D обьект
LPDIRECT3DDEVICE9           pDirect3DDevice    = NULL;      // Устройство 
LPDIRECT3DVERTEXBUFFER9     pBufferVershin     = NULL;      // Буфер вершин

struct CUSTOMVERTEX
{
    FLOAT x, y, z;      //кординаты 
    DWORD color;        //цвет вершин
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)  // Формат вершин

//-----------------------------------------------------------------------------------
// Функция
// InitialDirect3D()
// Инициализация Direct3D
//-----------------------------------------------------------------------------------

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         = TRUE;
    Direct3DParametr.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat = Display.Format;

    if( FAILED( pDirect3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                      &Direct3DParametr, &pDirect3DDevice ) ) )
    {
        return E_FAIL;
    }
    
    
    pDirect3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

    // Отключить освещенние Direct3D
    pDirect3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

    return S_OK;
}
//---------------------------------------------------------------------------------------
// Функция
// InitialBufferVershin()
// Иннициализирует вершины
//---------------------------------------------------------------------------------------

HRESULT InitialBufferVershin()
{
   
    CUSTOMVERTEX Vershin[] =
    {
        {  1.0f,-1.0f, 0.0f, 0x00000fff, }, //А
        { -1.0f,-1.0f, 0.0f, 0xff000fff, }, //В
        { -1.0f, 1.0f, 0.0f, 0x00000fff, }, //С
        
        { -1.0f, 1.0f, 0.0f, 0x00000fff, }, //C
        {  1.0f, 1.0f, 0.0f, 0xff000fff, }, //D
        {  1.0f,-1.0f, 0.0f, 0x00000fff, }, //A
        //  x     y     z      color
    };

    if( FAILED( pDirect3DDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  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;
}
//-----------------------------------------------------------------------------
// Функция
// Matrix()
// Мировая матрица, матрица вида, матрица проекции
//-----------------------------------------------------------------------------
VOID Matrix()
{
    
    D3DXMATRIX MatrixWorld;      //  Мировая матрица (MatrixWorld)
    D3DXMATRIX MatrixView;       //  Матрица вида (MatrixView)
    D3DXMATRIX MatrixProjection; //  Матрица проекции (MatrixProjection)
    // MatrixWorld
    UINT  Time  = timeGetTime() % 5000;
    FLOAT Angel = Time * (2.0f * D3DX_PI) / 5000.0f;
    D3DXMatrixRotationY( &MatrixWorld, Angel );
    pDirect3DDevice->SetTransform( D3DTS_WORLD, &MatrixWorld );
    // MatrixView
    D3DXMatrixLookAtLH( &MatrixView,  &D3DXVECTOR3 ( 0.0f, 0.0f,-8.0f ),
                                      &D3DXVECTOR3 ( 0.0f, 0.0f, 0.0f ),
                                      &D3DXVECTOR3 ( 0.0f, 1.0f, 0.0f ) );
    pDirect3DDevice->SetTransform( D3DTS_VIEW, &MatrixView );
    // MatrixProjection
    D3DXMatrixPerspectiveFovLH( &MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    pDirect3DDevice->SetTransform( D3DTS_PROJECTION, &MatrixProjection );
}
//-----------------------------------------------------------------------------------
//  Функция
//  RenderingDirect3D()
//  Рисуем
//-----------------------------------------------------------------------------------

VOID RenderingDirect3D()
{
    
    if(pDirect3DDevice == NULL)        // Проверяем ошибки
        return;
    
    
    pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,0), 1.0f, 0 );
    
    pDirect3DDevice->BeginScene();     // Начало сцены
    
    Matrix();

    //  Здесь происходит прорисовка сцены
    pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) );
    pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    pDirect3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );

    pDirect3DDevice->EndScene();       //Конец сцены
    
    pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
      
}

//-----------------------------------------------------------------------------------
//  Функция
//  DeleteDirect3D()
//  Освобождает захваченные ресурсы
//-----------------------------------------------------------------------------------

VOID DeleteDirect3D()
{

    if( pBufferVershin  != NULL)
        pBufferVershin->Release(); 

    if( pDirect3DDevice != NULL) 
        pDirect3DDevice->Release();

    if( pDirect3D != NULL)
        pDirect3D->Release();
}

//-----------------------------------------------------------------------------------
// Функция
// MainWinProc()
// Здесь происходит обработка сообщений
//-----------------------------------------------------------------------------------

LRESULT CALLBACK MainWinProc(HWND   hwnd,            
                            UINT    msg,              
                            WPARAM  wparam,           
                            LPARAM  lparam)          
{

switch(msg)
    {    
    
     case WM_DESTROY: 
        {
        DeleteDirect3D();
        PostQuitMessage(0);
        return(0);
        } 
    } 

  
return DefWindowProc(hwnd, msg, wparam, lparam);



//-----------------------------------------------------------------------------------
// Функция
// WinMain
// Входная точка приложения
//-----------------------------------------------------------------------------------

int WINAPI WinMain(    HINSTANCE hinstance,
                    HINSTANCE hprevinstance,
                    LPSTR lpcmdline,
                    int ncmdshow)
{

WNDCLASSEX windowsclass;  // Создаем класс
HWND       hwnd;          // Создаем дескриптор окна
MSG        msg;           // Идентификатор сообщения

// Определим класс окна WNDCLASSEX
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",         // класс
                       " Урок 6. Вращаем Квадрат ",     // название окна
                       WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                       300,150,                   // левый верхний угол
                       500,400,                // ширина и высота
                       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;
}
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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