日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D3D API - D3DXCreateRenderToSurface渲染到纹理

發布時間:2024/4/11 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 D3D API - D3DXCreateRenderToSurface渲染到纹理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 初始化:?

//創建紋理對象
?if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"shitoub01.jpg", &g_pTexture ) ) )
?{
??MessageBox(NULL, L"創建紋理失敗", L"Texture.exe", MB_OK);
??return E_FAIL;
?}

?

?HRESULT hr;
?hr = D3DXCreateTexture(g_pd3dDevice, 256,256,1,D3DUSAGE_RENDERTARGET|D3DUSAGE_AUTOGENMIPMAP, D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT,&g_pTexture2);
?D3DSURFACE_DESC desc;
?g_pTexture2->GetLevelDesc(0,&desc);
?hr = D3DXCreateRenderToSurface(g_pd3dDevice,desc.Width,desc.Height,desc.Format,true,D3DFMT_D24S8,&g_pRTS);
?hr = g_pTexture2->GetSurfaceLevel(0,&g_pSurface);
二 使用:
?//開始在后臺緩沖區繪制圖形
?if( SUCCEEDED( g_pd3dDevice->BeginScene() ))
?{
??SetupWorld();
??SetupMatrices();

??D3DVIEWPORT9 vp = {0,0,256,256,0,1};
??g_pd3dDevice->EndScene();
??g_pRTS->BeginScene(g_pSurface, &vp);
??g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL,D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
??g_pd3dDevice->SetTexture(0, g_pTexture);
??g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
??g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
??g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
??g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
??g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
??g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
??D3DXSaveSurfaceToFileA("tt.bmp",D3DXIFF_BMP, g_pSurface, NULL, NULL);
??g_pRTS->EndScene(D3DX_FILTER_NONE);

??
??g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
??g_pd3dDevice->BeginScene() ;
??g_pd3dDevice->SetTexture(0, g_pTexture2);
??g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
??g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
??g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

??g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
??g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
??g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

??//結束在后臺緩沖區繪制圖形
??g_pd3dDevice->EndScene();
?}?

?

三 程序:

?

//=============================================================================
//?Desc:?紋理影射基礎
//=============================================================================

#include?
<d3dx9.h>

//-----------------------------------------------------------------------------
//?Desc:?全局變量
//-----------------------------------------------------------------------------
LPDIRECT3D9?????????????g_pD3D???????=?NULL;????//Direct3D對象
LPDIRECT3DDEVICE9???????g_pd3dDevice?=?NULL;????//Direct3D設備對象
HWND????????????????????g_hWnd???????=?NULL;

LPDIRECT3DVERTEXBUFFER9?g_pVB????????
=?NULL;????//頂點緩沖區對象
LPDIRECT3DTEXTURE9??????g_pTexture???=?NULL;????//紋理對象
LPDIRECT3DTEXTURE9??????g_pTexture2??=?NULL;????//紋理對象
ID3DXRenderToSurface???*g_pRTS???????=?NULL;
LPDIRECT3DSURFACE9??????g_pSurface???
=?NULL;

//-----------------------------------------------------------------------------
//?Desc:?頂點結構
//-----------------------------------------------------------------------------
struct?CUSTOMVERTEX
{
????FLOAT?x,?y,?z,w;????
//頂點位置??
????DWORD?diffuse;
????FLOAT?u,v?;??????????
//頂點紋理坐標
};
#define?D3DFVF_CUSTOMVERTEX???(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1)


void?SetupWorld()
{
????
//創建并設置世界矩陣
????D3DXMATRIXA16?matWorld;
????D3DXMatrixIdentity(?
&matWorld?);
????g_pd3dDevice
->SetTransform(?D3DTS_WORLD,?&matWorld?);
}

//-----------------------------------------------------------------------------
//?Desc:?設置變換矩陣
//-----------------------------------------------------------------------------
VOID?SetupMatrices()
{
????
//創建并設置觀察矩陣
????D3DXVECTOR3?vEyePt(?0.0f,?0.0f,?-5?);
????D3DXVECTOR3?vLookatPt(?
0.0f,?0.0f,?0.0f?);
????D3DXVECTOR3?vUpVec(?
0.0f,?1.0f,?0.0f?);
????D3DXMATRIXA16?matView;
????D3DXMatrixLookAtLH(?
&matView,?&vEyePt,?&vLookatPt,?&vUpVec?);
????g_pd3dDevice
->SetTransform(?D3DTS_VIEW,?&matView?);

????
//創建并設置投影矩陣
????D3DXMATRIXA16?matProj;
????D3DXMatrixPerspectiveFovLH(?
&matProj,?D3DX_PI/2,?1.0f,?1.0f,?100.0f?);
????g_pd3dDevice
->SetTransform(?D3DTS_PROJECTION,?&matProj?);
}

//-----------------------------------------------------------------------------
//?Desc:?初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT?InitD3D(?HWND?hWnd?)
{
????
//創建Direct3D對象,?該對象用于創建Direct3D設備對象
????if(?NULL?==?(?g_pD3D?=?Direct3DCreate9(?D3D_SDK_VERSION?)?)?)
????????
return?E_FAIL;

????
//設置D3DPRESENT_PARAMETERS結構,?準備創建Direct3D設備對象
????D3DPRESENT_PARAMETERS?d3dpp;
????ZeroMemory(?
&d3dpp,?sizeof(d3dpp)?);
????d3dpp.Windowed?
=?TRUE;
????d3dpp.SwapEffect?
=?D3DSWAPEFFECT_DISCARD;
????d3dpp.BackBufferFormat?
=?D3DFMT_X8R8G8B8;
????d3dpp.EnableAutoDepthStencil?
=?TRUE;
????d3dpp.AutoDepthStencilFormat?
=?D3DFMT_D24S8;

????
//創建Direct3D設備對象
????if(?FAILED(?g_pD3D->CreateDevice(?D3DADAPTER_DEFAULT,?D3DDEVTYPE_HAL,?hWnd,
????????D3DCREATE_SOFTWARE_VERTEXPROCESSING,
????????
&d3dpp,?&g_pd3dDevice?)?)?)
????{
????????
return?E_FAIL;
????}

????
//禁用照明效果
????g_pd3dDevice->SetRenderState(?D3DRS_LIGHTING,?FALSE?);?

????
//設置變換矩陣
????SetupWorld();
????SetupMatrices();

????
return?S_OK;
}

//-----------------------------------------------------------------------------
HRESULT?InitGriphics()
{
????
//創建紋理對象
????if(?FAILED(?D3DXCreateTextureFromFile(?g_pd3dDevice,?L"shitoub01.jpg",?&g_pTexture?)?)?)
????{
????????MessageBox(NULL,?L
"創建紋理失敗",?L"Texture.exe",?MB_OK);
????????
return?E_FAIL;
????}



????HRESULT?hr;
????hr?
=?D3DXCreateTexture(g_pd3dDevice,?256,256,1,D3DUSAGE_RENDERTARGET|D3DUSAGE_AUTOGENMIPMAP,?D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT,&g_pTexture2);
????D3DSURFACE_DESC?desc;
????g_pTexture2
->GetLevelDesc(0,&desc);
????hr?
=?D3DXCreateRenderToSurface(g_pd3dDevice,desc.Width,desc.Height,desc.Format,true,D3DFMT_D24S8,&g_pRTS);
????hr?
=?g_pTexture2->GetSurfaceLevel(0,&g_pSurface);

????
//頂點數據
????CUSTOMVERTEX?g_Vertices[]?=
????{
????????{?
0,?????256,??0.5f,?1.0f,0xffffffff,??0.0f,?1.0f},???
????????{?
0,???????0,??0.5f,?1.0f,0xffffffff,??0.0f,?0.0f},????
????????{??
256,??256,??0.5f,?1.0f,0xffffffff,??1.0f,?1.0f},????
????????{??
256,????0,??0.5f,?1.0f,0xffffffff,??1.0f,?0.0f?}

????};

????
//創建頂點緩沖區
????if(?FAILED(?g_pd3dDevice->CreateVertexBuffer(?4*sizeof(CUSTOMVERTEX),
????????
0,?D3DFVF_CUSTOMVERTEX,
????????D3DPOOL_MANAGED,?
&g_pVB,NULL?)?)?)
????{
????????
return?E_FAIL;
????}

????
//填充頂點緩沖區
????VOID*?pVertices;
????
if(?FAILED(?g_pVB->Lock(?0,?sizeof(g_Vertices),?(void**)&pVertices,?0?)?)?)
????????
return?E_FAIL;
????memcpy(?pVertices,?g_Vertices,?
sizeof(g_Vertices)?);
????g_pVB
->Unlock();

????
return?S_OK;
}


//-----------------------------------------------------------------------------
//?Desc:?釋放創建的對象
//-----------------------------------------------------------------------------
VOID?Cleanup()
{
????
//釋放Direct3D設備對象
????if(?g_pd3dDevice?!=?NULL?)?
????????g_pd3dDevice
->Release();

????
//釋放Direct3D對象
????if(?g_pD3D?!=?NULL?)???????
????????g_pD3D
->Release();
}


//-----------------------------------------------------------------------------
//?Desc:?渲染圖形?
//-----------------------------------------------------------------------------
VOID?Render()
{
????
//清空后臺緩沖區

????
//開始在后臺緩沖區繪制圖形
????
//if(?SUCCEEDED(??)
????{
????????SetupWorld();
????????SetupMatrices();

????????D3DVIEWPORT9?vp?
=?{0,0,256,256,0,1};
????????g_pRTS
->BeginScene(g_pSurface,?&vp);
????????g_pd3dDevice
->Clear(?0,?NULL,?D3DCLEAR_TARGET?|?D3DCLEAR_ZBUFFER?|?D3DCLEAR_STENCIL,D3DCOLOR_XRGB(45,?50,?170),?1.0f,?0?);
????????g_pd3dDevice
->SetTexture(0,?g_pTexture);
????????g_pd3dDevice
->SetTextureStageState(0,?D3DTSS_COLOROP,?D3DTOP_SELECTARG1);
????????g_pd3dDevice
->SetTextureStageState(0,?D3DTSS_COLORARG1,?D3DTA_TEXTURE);
????????g_pd3dDevice
->SetTextureStageState(0,?D3DTSS_ALPHAOP,?D3DTOP_DISABLE);
????????g_pd3dDevice
->SetStreamSource(0,?g_pVB,?0,?sizeof(CUSTOMVERTEX));
????????g_pd3dDevice
->SetFVF(D3DFVF_CUSTOMVERTEX);
????????g_pd3dDevice
->DrawPrimitive(D3DPT_TRIANGLESTRIP,?0,?2);
????????D3DXSaveSurfaceToFileA(
"tt.bmp",D3DXIFF_BMP,?g_pSurface,?NULL,?NULL);
????????g_pRTS
->EndScene(D3DX_FILTER_NONE);

????????
????????g_pd3dDevice
->Clear(?0,?NULL,?D3DCLEAR_TARGET?|?D3DCLEAR_ZBUFFER?|?D3DCLEAR_STENCIL,?D3DCOLOR_XRGB(45,?50,?170),?1.0f,?0?);
????????g_pd3dDevice
->BeginScene()?;
????????g_pd3dDevice
->SetTexture(0,?g_pTexture2);
????????g_pd3dDevice
->SetTextureStageState(0,?D3DTSS_COLOROP,?D3DTOP_SELECTARG1);
????????g_pd3dDevice
->SetTextureStageState(0,?D3DTSS_COLORARG1,?D3DTA_TEXTURE);
????????g_pd3dDevice
->SetTextureStageState(0,?D3DTSS_ALPHAOP,?D3DTOP_DISABLE);

????????g_pd3dDevice
->SetStreamSource(0,?g_pVB,?0,?sizeof(CUSTOMVERTEX));
????????g_pd3dDevice
->SetFVF(D3DFVF_CUSTOMVERTEX);
????????g_pd3dDevice
->DrawPrimitive(D3DPT_TRIANGLESTRIP,?0,?2);

????????
//結束在后臺緩沖區繪制圖形
????????g_pd3dDevice->EndScene();
????}

????
//將在后臺緩沖區繪制的圖形提交到前臺緩沖區顯示
????g_pd3dDevice->Present(?NULL,?NULL,?NULL,?NULL?);
}


//-----------------------------------------------------------------------------
//?Desc:?消息處理
//-----------------------------------------------------------------------------
LRESULT?WINAPI?MsgProc(?HWND?hWnd,?UINT?msg,?WPARAM?wParam,?LPARAM?lParam?)
{
????
switch(?msg?)
????{
????
case?WM_DESTROY:
????????Cleanup();
????????PostQuitMessage(?
0?);
????????
return?0;
????}

????
return?DefWindowProc(?hWnd,?msg,?wParam,?lParam?);
}



//-----------------------------------------------------------------------------
//?Desc:?入口函數
//-----------------------------------------------------------------------------
INT?WINAPI?WinMain(?HINSTANCE?hInst,?HINSTANCE,?LPSTR,?INT?)
{

????
//注冊窗口類
????WNDCLASSEX?wc?=?{?sizeof(WNDCLASSEX),?CS_CLASSDC,?MsgProc,?0L,?0L,
????????GetModuleHandle(NULL),?NULL,?NULL,?NULL,?NULL,
????????L
"ClassName",?NULL?};
????RegisterClassEx(?
&wc?);

????
//創建窗口
????HWND?hWnd?=?CreateWindow(??L"ClassName",?L"紋理影射基礎",
????????WS_OVERLAPPEDWINDOW,?
200,?100,?800,?600,
????????GetDesktopWindow(),?NULL,?wc.hInstance,?NULL?);
????g_hWnd?
=?hWnd;

????
//初始化Direct3D
????if(?SUCCEEDED(?InitD3D(?hWnd?)?)?)
????{
????????
//創建場景圖形
????????if(?SUCCEEDED(InitGriphics())?)
????????{

????????????
//顯示窗口
????????????ShowWindow(?hWnd,?SW_SHOWDEFAULT?);
????????????UpdateWindow(?hWnd?);

????????????
//進入消息循環
????????????MSG?msg;
????????????ZeroMemory(?
&msg,?sizeof(msg)?);
????????????
while(?msg.message!=WM_QUIT?)
????????????{
????????????????
if(?PeekMessage(?&msg,?NULL,?0U,?0U,?PM_REMOVE?)?)
????????????????{
????????????????????TranslateMessage(?
&msg?);
????????????????????DispatchMessage(?
&msg?);
????????????????}
????????????????
else
????????????????{
????????????????????Render();??
//渲染圖形
????????????????}
????????????}
????????}
????}

????UnregisterClass(??L
"ClassName",?wc.hInstance?);
????
return?0;
}

?

?

轉載于:https://www.cnblogs.com/lancidie/archive/2011/03/16/1985992.html

總結

以上是生活随笔為你收集整理的D3D API - D3DXCreateRenderToSurface渲染到纹理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。