2015-06-07 6 views
0

Я следую вместе с книгой под названием Introduction To 3D Game Programming With Directx 9.0 и я скопировать и вставить следующий пример из книги:Рисование текстурированная четырехъядерный выглядит искаженным

struct Vertex 
{ 
    float _x, _y, _z; 
    float _nx, _ny, _nz; 
    float _u, _v; // texture coordinates 
    static const DWORD FVF; 
}; 

const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1; 

void D3DGraphics::drawBMP() 
{ 
    pDevice->CreateVertexBuffer(6 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &quadVertexBuffer, 0); 
    Vertex* v; 
    quadVertexBuffer->Lock(0, 0, (void**)&v, 0); 

    // quad built from two triangles, note texture coordinates: 
    v[0] = { -1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f }; // was Vertex() 
    v[1] = { -1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f }; 
    v[2] = { 1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f }; 
    v[3] = { -1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f }; 
    v[4] = { 1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f }; 
    v[5] = { 1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f }; 
    quadVertexBuffer->Unlock(); 

    // Load texture data. 
    if (!texture) 
    { 
     D3DXCreateTextureFromFile(pDevice, L"C:\\Users\\Owner\\Desktop\\Result.bmp", &texture); 
    } 

    // Enable the texture. 
    pDevice->SetTexture(0, texture); 

    // Set texture filters. 
    pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 
    pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 
    pDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT); 

    // set projection matrix 
    D3DXMATRIX proj; 
    D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, (float)1280/(float)720, 1.0f, 1000.0f); 
    pDevice->SetTransform(D3DTS_PROJECTION, &proj); 

    // don't use lighting for this sample 
    pDevice->SetRenderState(D3DRS_LIGHTING, false); 



    // render code 
    pDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); 
    pDevice->BeginScene(); 
    pDevice->SetStreamSource(0, quadVertexBuffer, 0, sizeof(Vertex)); 
    pDevice->SetFVF(Vertex::FVF); 
    // Draw primitives using presently enabled texture. 
    pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 
    pDevice->EndScene(); 
    pDevice->Present(0, 0, 0, 0); 
} 

я только изменил одну вещь. В Структуры в книге инициализируются как таковой:

v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f); 
v[1] = Vertex(-1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f); 
v[2] = Vertex(1.0f, 1.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, 1.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); 

но, кажется, дает ошибку компилятора, поэтому я изменил его в своем коде. В любом случае, размеры Result.bmp составляют 1280x720. Окно, которое я обрабатываю, также равно 1280x720. Вот Result.bmp. Вот output Я получаю. Обычно я не задавал бы такой простой вопрос, но я пытаюсь учиться, и это пример из учебника (это не работает). Учитывая, что это копия & пасты из книги, я не думаю, что я допустил какую-либо ошибку (пока), и мне было интересно, если это ошибка в книге. Игра со вторым аргументом D3DXMatrixPerspectiveFovLH показалась лучше, если я изменил 0.5f на 0.4f, но он все еще искажен.

+0

ошибку Какого компилятора? –

ответ

1

Поскольку вы используете D3DXMatrixPerspectiveFovLH, вы представляете квадратный квадрат с углами (-1, -1) -> (1,1). Поскольку BMP имеет 16: 9 aspect ratio, результатом является искаженное изображение текстуры.

Если вы хотите, чтобы изображение, чтобы быть полный экран, вы должны использовать не перспективную проекцию на такую, как D3DXMatrixOrthoLH:

// set projection matrix 
D3DXMATRIX proj; 
D3DXMatrixOrthoLH(&proj, 2.0f, 2.0f, 1.0f, 1000.0f); 
pDevice->SetTransform(D3DTS_PROJECTION, &proj); 

В этом случае, тот же четырехъядерный будет иметь 16: 9 формат необходимо сделать входное изображение для устранения искажения.

BTW: Я бы рекомендовал переход к DirectX 11 и использование DirectX Tool Kit «s SpriteBatch вместо старого десятилетия Direct3D 9 API ...

+0

Спасибо. Для всех в будущем текущие параметры, казалось, создали очень маленький ящик (3 пикселя на 3 пикселя или около того). Изменив его на 'D3DXMatrixOrthoLH (& proj, 2.0f, 2.0f, 1.0f, 1000.0f),' казалось, решил (теперь он полноэкранный). –

+0

Право извините. Соотношение сторон входит в игру только для перспективы. –