将纹理渲染到窗口

发布于 2024-12-09 13:33:28 字数 154 浏览 0 评论 0原文

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

实施上述内容的最佳方法是什么?

I've got a dialog that I'd basically like to implement as a texture viewer using DirectX. The source texture can either come from a file on-disk or from an arbitrary D3D texture/surface in memory. The window will be resizable, so I'll need to be able to scale its contents accordingly (preserving aspect ratio, while not necessary, would be useful to know).

What would be the best way to go about implementing the above?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

つ低調成傷 2024-12-16 13:33:28

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

编辑:这是一个示例图:

IMHO the easiest way to do this is to create a quad (or two triangles) whose vertices contain the correct UV-coordinates. The XYZ coordinates you set to the viewing cube coordinates. This only works if the identity matrix is set as projection. You can use -1 to 1 on both X and Y axes.

EDIT: Here an example turorial:

你是暖光i 2024-12-16 13:33:28

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

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;
}
}

希望这有帮助!

This is the code I use to preserve size and scaling for resizeable dialogue. My texture is held in a memory bitmap. I am sure you can adapt if you do not have a memory bitmap. The important bits is the way I determine the right scaling factor to preserve the aspect ratio for any client area size

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;
}
}

Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文