将纹理渲染到窗口

时间:2011-10-14 09:40:37

标签: c++ directx rendering textures direct3d

我有一个对话框,我基本上想要使用DirectX作为纹理查看器来实现。源纹理可以来自磁盘上的文件,也可以来自内存中的任意D3D纹理/表面。窗口将是可调整大小的,因此我需要能够相应地扩展其内容(保留纵横比,虽然没有必要,但是有用的知识)。

实施上述目标的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

恕我直言,最简单的方法是创建一个四边形(或两个三角形),其顶点包含正确的UV坐标。 XYZ坐标设置为查看立方体坐标。这仅在单位矩阵设置为投影时有效。您可以在X和Y轴上使用-1到1。

编辑:这是一个例子:

答案 1 :(得分:1)

这是我用来保存可调整大小对话的大小和缩放的代码。我的纹理保存在内存位图中。如果你没有内存位图,我相信你可以适应。重要的是我确定正确的缩放因子以保留任何客户区域大小的宽高比​​

的方式
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;
}
}

希望这有帮助!