目的:將一張圖片,利用DX10的點精靈畫到創建的視窗上
問題:無法將原始圖片大小畫上去,始終是被縮放的狀態。被縮放的默認大小為創建的視口物件(D3D10_VIEWPORT)的1/4
例如,我創建的視窗是800X600,要畫的圖片是224X224,如果創建的視口是800X600(與視窗相等),那么畫出的圖片是400X300.
為什么會這樣呢,我想要畫出圖片原本的大小,需要怎么做。
關鍵代碼如下
HRESULT InitD3D(HWND hWnd)
{
//創建Direct3D物件, 該物件用于創建Direct3D設備物件
ID3D10RenderTargetView * ppRenderTargetViews[1];
ID3D10DepthStencilView * ppDepthStencilView = NULL;
if (g_pShaderResource != NULL)
{
g_pShaderResource->Release();
}
DXGI_SWAP_CHAIN_DESC sd;
sd.BufferDesc.Width = 800;
sd.BufferDesc.Height = 600;
sd.BufferDesc.RefreshRate.Numerator = 1;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = hWnd;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
OutputDebugString(L"Init Start\n");
D3D10CreateDeviceAndSwapChain(0, D3D10_DRIVER_TYPE_REFERENCE, 0, 0, D3D10_SDK_VERSION, &sd, &mSwapChain, &g_pd3dDevice);
// 創建點精靈
HRESULT SpriteResult = D3DX10CreateSprite(g_pd3dDevice, 1, &g_pSprite);
if (FAILED(SpriteResult))
{
OutputDebugString(L"CreateSprite Failed\n");
}
ID3D10Texture2D* _texture;
D3DX10CreateTextureFromFile(g_pd3dDevice, L"1.JPG", NULL, NULL,
(ID3D10Resource**)&_texture, NULL);
g_pd3dDevice->CreateShaderResourceView(_texture, NULL, &g_pShaderResource);
g_pd3dDevice->OMGetRenderTargets(1, ppRenderTargetViews, &ppDepthStencilView);
if (ppRenderTargetViews[0] == NULL) {
//創建渲染目標視圖
ID3D10Texture2D *pBackBuffer = NULL;
//獲取后緩沖區地址
HRESULT hResult = mSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);
if (FAILED(hResult))
return hResult;
//創建目標視圖
hResult = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_pRenderTargetView);
//釋放后緩沖
pBackBuffer->Release();
if (FAILED(hResult))
return hResult;
g_pd3dDevice->OMSetRenderTargets(1, &g_pRenderTargetView, ppDepthStencilView);
}
//設定viewport
D3D10_VIEWPORT vp;
vp.Width = 800;
vp.Height = 600;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDevice->RSSetViewports(1, &vp);
return S_OK;
}
VOID Render()
{
OutputDebugString(L"Render Start\n");
float ClearColor[4] = { 0.5f, 0.5f, 0.5f, 0.5f };
g_pd3dDevice->ClearRenderTargetView(g_pRenderTargetView, ClearColor);
D3DX10_SPRITE SpriteToDraw;
D3DXMatrixTranslation(&SpriteToDraw.matWorld, 0.0f, 0.0f, 0.0f);
D3D10_RASTERIZER_DESC rasterizerDesc =
{
D3D10_FILL_SOLID, D3D10_CULL_NONE, FALSE, 0, 0.0f, 0.0f,
TRUE, FALSE, FALSE, FALSE
};
ID3D10RasterizerState* _rasterizerState;
g_pd3dDevice->CreateRasterizerState(&rasterizerDesc, &_rasterizerState);
g_pd3dDevice->RSSetState(_rasterizerState);
SpriteToDraw.TexCoord.x = 0.0f;
SpriteToDraw.TexCoord.y = 0.0f;
SpriteToDraw.TexSize.x = 1.0f;
SpriteToDraw.TexSize.y = 1.0f;
SpriteToDraw.ColorModulate = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
SpriteToDraw.pTexture = g_pShaderResource;
SpriteToDraw.TextureIndex = 0;
if (SUCCEEDED(g_pSprite->Begin(D3DX10_SPRITE_SORT_TEXTURE)))
{
OutputDebugString(L"g_pSprite->Begin\n");
HRESULT DrawResult = g_pSprite->DrawSpritesBuffered(&SpriteToDraw, 1);
if (FAILED(DrawResult)) {
OutputDebugString(L"Draw Failed\n");
WCHAR sOut2[256] = { 0 };
wsprintf(sOut2, L"Draw Failed %d", DrawResult);
OutputDebugString(sOut2);
}
g_pSprite->Flush();
g_pSprite->End();
}
//將在后臺緩沖區繪制的圖形提交到前臺緩沖區顯示
mSwapChain->Present(0, 0);
}
uj5u.com熱心網友回復:
你可以自己計算變換矩陣進行縮放uj5u.com熱心網友回復:
變換矩陣我知道,但我比較疑惑的是在不設定其他為什么畫不出圖片的原始大小uj5u.com熱心網友回復:
因為圖片的長寬比與視口的長寬比不同uj5u.com熱心網友回復:
看看這個函式 XMMatrixPerspectiveFovLH轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/23495.html
標籤:圖形處理/算法
上一篇:AccpetEx 完成埠,SO_ACCEPT SO_RECEIVE 需要delete pOverlapped嗎?
下一篇:directdraw影像縮放失真
