Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

DirectX drawPrimitive() - błędne kolory.

Ostatnio zmodyfikowano 2013-11-26 16:55
Autor Wiadomość
ElChupacabra
Temat założony przez niniejszego użytkownika
DirectX drawPrimitive() - błędne kolory.
» 2013-11-26 16:55:21
Witam. Męczę się już od dłuższego czasu z prostym w zasadzie zadaniem jakim jest narysowanie kilku trójkątów. Rysując teksturę wszystko działa, mogę na teksturach też zrobić natężenie koloru/alfę przez DIFFUSE w strukturze customvertex.
Zadeklarowałem drugą strukturę customvertex:
C/C++
struct SIMPLEVERTEX {
    float x, y, z;
    DWORD color;
};
#define D3DFVF_SIMPLEVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE)
Z tym, że niestety coś idzie nie tak z samym rysowaniem, tj. czerwonego koloru jakby w ogóle nie brało pod uwagę, zielonego bierze chyba połowę, natomiast niebieski i alfa poprawnie działają. Kolor 0xffff0000 rysuje się jako czarny, 0xff00ff00 jako ciemnozielony, 0xffffffff to niebieski z domieszką zielonego... Sama funkcja rysująca wygląda tak:
C/C++
void APIdirectX::drawPolygon( float * vertices, int count ) {
    SIMPLEVERTEX * v;
    reallocVB( count );
    pVB->Lock( 0, 0,( void ** ) & v, 0 );
    memset( v, 0, sizeof( SIMPLEVERTEX ) * count );
    for( int i = 0; i < count; i++ ) {
        v[ i ].x = vertices[ i << 1 ];
        v[ i ].y = vertices[( i << 1 ) + 1 ];
        v[ i ].color = dwColor;
    }
    pVB->Unlock();
   
    pd3dDevice->SetStreamSource( 0, pVB, 0, sizeof( SIMPLEVERTEX ) );
    pd3dDevice->SetFVF( D3DFVF_SIMPLEVERTEX );
    pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, count - 2 );
}
Dodam, że portuję silnik z OpenGL na DX i na OpenGL analogiczna funkcja działa prawidłowo, ale to pewnie nie ma większego znaczenia :)

dwColor to pole klasy APIdirectX i jest ustawiane przed drawPolygon w innej funkcji. W wywołaniu drawPolygon dwColor ma prawidłową wartość. Zresztą podmiana tej zmiennej na 0xffffffff też nie daje białego koloru.
Brałem pod uwagę, że może jest ustawiony 16-bitowy kolor, ale wtedy i tekstury źle by się rysowały, a tam wszystko działa. d3ddm.Format jest ustawiony na X8R8G8B8, czyli prawidłowo chyba. Myślałem też o tym, że coś z blendingiem w setRenderState jest źle, no ale dlaczego w takim razie kolor niebieski i częściowo zielony działają prawidłowo? Zresztą całkowite wyłączenie blendingu nic z kolorami nie zmienia.

Mogę zmieniać SetTextureStageState i rysować używając aktualnej tekstury tylko nie biorąc jej pod uwagę, tj. ustawić tak mieszanie kolorów, żeby była brana pod uwagę tylko zmienna D3DFVF_DIFFUSE, ale to nie jest rozwiązanie problemu, tylko jego ominięcie i to pewnie mało wydajne.

Ktoś ma jakiś pomysł?


EDIT: Zrobione. pd3dDevice->setTexture(0, 0); na początku drawPolygon() załatwiło sprawę.
P-97593
« 1 »
  Strona 1 z 1