Image

Imagetopright wrote in Imageru_cpp

Direct3d : Вывод текстуры в масштабе 1:1

Просьба привести пример программы, которая рендерит текстуру (в параллельной проекции) с точной шириной и длиной исходного изображения, т.е. в масштабе 1:1. Как ни верчу цифры, у меня получается небольшая погрешность. Буду благодарен также за замечания по следующему коду. Заранее спасибо!

Вот то, как я инициализирую сцену:

D3DXVECTOR3 position(0.0f, 0.0f, -1.0f); // position of eye
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); // view at
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // where's up
D3DXMatrixLookAtLH(&MatrixView, &position, &target, &up);

d3d_device->SetTransform(D3DTS_VIEW, &MatrixView);

D3DXMatrixOrthoOffCenterLH(&MatrixProjection,
0,
float(SCREEN_WIDTH),
0,
float(SCREEN_HEIGHT),
0.0f,
1000.0f);

d3d_device->SetTransform(D3DTS_PROJECTION, &MatrixProjection);

Вот создание квада:

quad->texel_x = pixel_x / source_width;
quad->texel_y = pixel_y / source_height;
quad->texel_right = (pixel_x + pixel_width) / source_width;
quad->texel_top = (pixel_y + pixel_height) / source_height;

quad->v[0] = dVertex( 0.0f, pixel_height, 0.0f,
quad->texel_x, quad->texel_y );
quad->v[1] = dVertex( pixel_width, pixel_height, 0.0f, quad->texel_right, quad->texel_y );
quad->v[2] = dVertex( pixel_width, 0.0f, 0.0f,
quad->texel_right, quad->texel_top );
quad->v[3] = dVertex( 0.0f, 0.0f, 0.0f, quad->texel_x, quad->texel_top );

Рендеринг:

// rotate
if (rotate_angle)
D3DXMatrixRotationZ(&MatrixWorld, rotate_angle);
else
D3DXMatrixIdentity(&MatrixWorld);

// scale
D3DXMatrixScaling(&temp, scale_x, scale_y, 1.0f);
D3DXMatrixMultiply(&MatrixWorld, &temp, &MatrixWorld);

// move
D3DXMatrixTranslation(&temp, x, y, z);
D3DXMatrixMultiply(&MatrixWorld, &MatrixWorld, &temp);

d3d_device->SetTransform(D3DTS_WORLD, &MatrixWorld);

d3d_device->DrawPrimitive(D3DPT_TRIANGLEFAN, quad->vb_offset, 2);