2011-10-14 77 views
0

我有一個基本上想用作DirectX的紋理查看器的對話框。源紋理可以來自磁盤上的文件,也可以來自內存中的任意D3D紋理/曲面。該窗口的尺寸可以調整大小,因此我需要能夠相應地縮放其內容(保留寬高比,而不是必要的,這對知道有用)。將紋理渲染到窗口

什麼是最好的方式去實施上述?

回答

1

恕我直言,最簡單的方法是創建一個四邊形(或兩個三角形),其頂點包含正確的UV座標。您設置爲查看立方座標的XYZ座標。這僅在單位矩陣設置爲投影時纔有效。您可以在X軸和Y軸上使用-1到1。

編輯:下面的例子turorial:

+0

謝謝!你會碰巧知道我在哪裏可以找到關於該主題的一些樣本材料?我對DirectX相對來說比較新。 – shadeMe

+0

我用DX8教程的鏈接更新了我的答案。但這個想法應該與DX 9,10 11一致 – Constantinius

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

希望這有助於!