Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Цвет фигуры меняется в DirectX

14K
25 июля 2006 года
MMMM
5 / / 12.12.2005
Я в оконном режиме рисую два квадрата. На один натягиваю текстуру, а на другом указываю цвет вершин. Если я отображаю только второй квадрат, то он показывается тем цветом, который я задавал, а если рисую оба квадрата, то квадрат с текстурой показывается нормально, а второй квадрат показывается черным цветом.
Сейчас код оформить некогда, но вдруг без кода кто-нибудь знает почему так.
302
26 июля 2006 года
Sagittarius
648 / / 12.04.2003
А ты при отрисовке второго квадрата используешь такую же структуру для описания вершин, как для квадрата с текстурой?
В общем, показывай свой код.

P.S. DirectX цвета сам не меняет.
14K
26 июля 2006 года
MMMM
5 / / 12.12.2005
Код:
//Первая фигура
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1)

struct Vertex
{
  float x, y, z;
  float tu, tv;
};

class f1
{
    const static Vertex verts[] =
        {
            -1.0f, -0.6f, 1.0f, 0, 1,
            -1.0f,  1.0f, 1.0f, 0, 0,
             1.0f,  1.0f, 1.0f, 1, 0,
             1.0f, -0.6f, 1.0f, 1, 1,
        };

    const unsigned short inds[] =
        {
            0,1,3,3,1,2,
        };

    bool init()
    {
        HRESULT hr;
        void * pBuf;

        D3DXCreateTextureFromResource(pDevice, NULL, (LPCSTR)BITMAP1, &pTexture);

        hr = pDevice->CreateVertexBuffer(sizeof(Vertex)*4, 0, D3DFVF_VERTEX, D3DPOOL_DEFAULT, &pVB, 0);
        if(FAILED(hr))
            return false;

        hr = pVB->Lock(0, sizeof(Vertex)*4, &pBuf, 0);
        if(FAILED(hr))
            return false;
        memcpy(pBuf, verts, sizeof(Vertex)*4);
        pVB->Unlock();

        hr = pDevice->CreateIndexBuffer(sizeof(short)*6, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, 0);
        if(FAILED(hr))
            return false;
        hr = pIB->Lock(0, sizeof(short)*6, &pBuf, 0);
        if(FAILED(hr))
            return false;
        memcpy(pBuf, inds, sizeof(short)*6);
        pIB->Unlock();

        return true;
    }

    f1()
    {
        init();
    }

    void Draw()
    {
        pDevice->SetFVF(D3DFVF_VERTEX);
        pDevice->SetTexture(0, pTexture);
        pDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
        pDevice->SetIndices(pIB);
        pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
    }
};



//Вторая фигура
#define D3DFVF_VERTEX1 (D3DFVF_XYZ | D3DFVF_DIFFUSE)

struct Vertex1
{
  float x, y, z;
  DWORD color;
};

class f2
{
    const static Vertex1 verts[] =
        {
            -0.7f, -0.7f, 0.0f, 0xffff0000,
            -0.7f,  0.7f, 0.0f, 0xffff0000,
             0.7f,  0.7f, 0.0f, 0xffff0000,
             0.7f, -0.7f, 0.0f, 0xffff0000,
        };

    const unsigned short inds[] =
        {
            0,1,3,3,1,2,
        };

    bool init()
    {

        HRESULT hr;
        void * pBuf;

        hr = pDevice->CreateVertexBuffer( sizeof(Vertex1) * 4,
            0 , D3DFVF_VERTEX1, D3DPOOL_DEFAULT, &pVB, 0 );
        if( FAILED(hr) )
            return false;

        hr = pVB->Lock( 0, sizeof(Vertex1) * 4, &pBuf, 0 );
        if( FAILED(hr) )
            return false;
        memcpy( pBuf, verts, sizeof(Vertex1) * 4);
        pVB->Unlock();

        hr = pDevice->CreateIndexBuffer( sizeof(short) * 6,
            0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&pIB, 0);
        if( FAILED(hr) )
            return false;

        hr = pIB->Lock( 0, sizeof(short) * 6, &pBuf, 0 );
        if( FAILED(hr) )
            return false;
        memcpy( pBuf, inds, sizeof(short) * 6);
        pIB->Unlock();

        return true;
    }

    f2()
    {
        init();
    }

    void Draw()
    {
        pDevice->SetFVF( D3DFVF_VERTEX1 );
        pDevice->SetStreamSource( 0, pVB, 0, sizeof(Vertex1) );
        pDevice->SetIndices(pIB);
        pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
    }
};



//Вывод фигур
f1 * k1 = new f1();
f2 * k2 = new f2();

        pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,155), 1.0f, 0 );
        pDevice->BeginScene();

        k1->Draw();
        k2->Draw();

        pDevice->EndScene();
        pDevice->Present( NULL, NULL, NULL, NULL );
302
26 июля 2006 года
Sagittarius
648 / / 12.04.2003
1. Я не гуру в C++, но что-то меня смущает строка bool win::init() в классе f2.
2. Проблема может быть в освещении.
3. Код не отформатирован, лениво разбираться подробнее. Заключи его в тег [ code ] [ / code ].
14K
26 июля 2006 года
MMMM
5 / / 12.12.2005
1. Структура класса объявлена в заголовочном файле. Здесть просто забыл у брать win::
2. Я источники света не добавлял.
3. Изменил.
302
27 июля 2006 года
Sagittarius
648 / / 12.04.2003
[QUOTE=MMMM]2. Я источники света не добавлял.[/QUOTE]
Источник света не добавлял, но само освещение мог включить.
Приведи пример кода инициализации DirectX.
14K
27 июля 2006 года
MMMM
5 / / 12.12.2005
Код:
pD3D = Direct3DCreate9( D3D_SDK_VERSION);
  if( !pD3D)
    return false;
 
  D3DPRESENT_PARAMETERS d3dpp = {0};
  d3dpp.Windowed = TRUE;
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  HRESULT hr;
  hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                           D3DCREATE_HARDWARE_VERTEXPROCESSING,
                           &d3dpp, &pDevice );
  if( FAILED(hr) || !pDevice)
    return false;

  pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог