Визуализация текстуры в окне - PullRequest
0 голосов
/ 14 октября 2011

У меня есть диалог, который я бы хотел реализовать в качестве средства просмотра текстур с использованием DirectX.Исходная текстура может быть получена из файла на диске или из произвольной текстуры / поверхности D3D в памяти.Размер окна будет изменяться, поэтому мне нужно будет соответствующим образом масштабировать его содержимое (полезно знать соотношение сторон, хотя и не обязательно).

Что лучше всего сделать?реализуете выше?

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Это код, который я использую для сохранения размера и масштабирования для диалога с изменяемым размером.Моя текстура хранится в битовой карте памяти.Я уверен, что вы можете адаптироваться, если у вас нет растрового изображения памяти.Важные биты - это способ определения правильного коэффициента масштабирования для сохранения соотношения сторон для любого размера клиентской области

CRect destRect( 0, 0, frameRect.Width(), frameRect.Height() );


if( txBitmapInfo.bmWidth <= frameRect.Width() && txBitmapInfo.bmHeight <= frameRect.Height() )
{
    destRect.left   = ( frameRect.Width() - txBitmapInfo.bmWidth ) / 2;
    destRect.right  = destRect.left +  txBitmapInfo.bmWidth;
    destRect.top    = ( frameRect.Height() - txBitmapInfo.bmHeight ) / 2;
    destRect.bottom = destRect.top +  txBitmapInfo.bmHeight;
} 
else
{
double  hScale = static_cast<double>( frameRect.Width() ) / txBitmapInfo.bmWidth;
double  vScale = static_cast<double>( frameRect.Height() ) / txBitmapInfo.bmHeight;

if( hScale < vScale )
{
    int height = static_cast<int>( frameRect.Width() * ( static_cast<double>(txBitmapInfo.bmHeight) / txBitmapInfo.bmWidth ) );

    destRect.top = ( frameRect.Height() - height ) / 2;
    destRect.bottom = destRect.top +  height;
}
else
{
    int width = static_cast<int>( frameRect.Height() * ( static_cast<double>(txBitmapInfo.bmWidth) / txBitmapInfo.bmHeight ) );

    destRect.left = ( frameRect.Width() - width ) / 2;
    destRect.right = destRect.left + width;
}
}

Надеюсь, это поможет!

1 голос
/ 14 октября 2011

ИМХО самый простой способ сделать это - создать квад (или два треугольника), вершины которых содержат правильные координаты UV. Координаты XYZ, установленные для координат просмотра куба. Это работает, только если идентификационная матрица установлена ​​как проекция Вы можете использовать от -1 до 1 по осям X и Y.

РЕДАКТИРОВАТЬ: Вот пример Turorial:

...