社区
游戏开发
帖子详情
在D3D里面如何使用Render to Texture?
ChinaShrimp
2004-10-20 05:31:25
我知道在OpenGL可以生成一个float类型的pbuffer,然后将可以渲染到里面去,但是操作起来很复杂。我想D3D里肯定也能实现Render to Texture,而且据说用起来很方便,我想请问一下如何使用?另外我还想问的就是在D3D里面能否设置pbuffer中的数据类型(例如浮点型)?多谢!
...全文
167
3
打赏
收藏
在D3D里面如何使用Render to Texture?
我知道在OpenGL可以生成一个float类型的pbuffer,然后将可以渲染到里面去,但是操作起来很复杂。我想D3D里肯定也能实现Render to Texture,而且据说用起来很方便,我想请问一下如何使用?另外我还想问的就是在D3D里面能否设置pbuffer中的数据类型(例如浮点型)?多谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
潘李亮
2004-10-24
打赏
举报
回复
SetRenderTarget.把一个纹理当作Surface.
seagate
2004-10-21
打赏
举报
回复
IDirect3DDevice9有个函数是SetRenderTarget。它能实现你要的功能。它有个参数是IDirect3DSurface9,可以作为存放的buffer。数据类型是创建这个surface时自己定的。
lly20000
2004-10-21
打赏
举报
回复
在D3D中可以通过d3dxsavetofile来保存当前的截图
D3DXSaveSurfaceToFile(file_name, D3DXIFF_JPG, frontbuf, NULL, NULL);
D
3D
11_
Render
To2D
Text
ure
D
3D
11_
Render
To2D
Text
ure
ColorFill_D
3D
11
Text
ure2D.rar
对ID
3D
11
Text
ure2D实现颜色填充(对D
3D
11实现IDirect
3D
Device9::ColorFill效果) 运行环境VS2019 编Rlease x86版本
D
3D
11初始化代码
D
3D
11初始化,一个最简单的D
3D
11应用程序。学习D
3D
的开始。
StereoIssues
时分法,真正的三维编程,场景渲染 #pragma warning(disable: 4995) #include
#include
#include
// Scenes 场景 #include "Scene.h" #include "StanfordBunnyScene.h" // Include nvstereo, but only for Dx10. #define NO_STEREO_D
3D
9 #include "nvstereo.h" //
Text
render
ing ID
3D
X10Font* gFont10 = NULL; ID
3D
X10Sprite* gSprite10 = NULL; CDXUT
Text
Helper* gTxtHelper = NULL; // our global vector of all our scenes. // Make this global because it's easier to work with DXUT this way const int cNoActiveScene = -1; std::vector
gScenes; int gActiveScene = cNoActiveScene; // A little UI stuff GUI图形用户界面 //CDXUTDialog这个类负责纪录一个对话框的所有属性以及它上面的所有控件信息 //CDXUTDialogResourceManager,这个类保存了所有注册过的对话框链表,以及这些对话框共享的资源 //CDXUTElement 这个类保存了需要渲染的元素信息,经常会在渲染函数中用到 //CGrowableArray< TYPE >类 可动态增长的链表类。 CDXUTDialogResourceManager gDialogResourceManager; CDXUTDialog gUI; // Our parameters for the stereo parameters
text
ure.纹理立体参数 nv::stereo::Param
Text
ureManagerD
3D
10* gStereoTexMgr = NULL; ID
3D
10
Text
ure2D* gStereoParam
Text
ure = NULL; ID
3D
10ShaderResourceView* gStereoParam
Text
ureRV = NULL; // Support going back and forth between fullscreen and windowed mode #define IDC_TOGGLEFULLSCREEN 1 #define IDC_MENU 2 // ------------------------------------------------------------------------------------------------ void Clear
Render
Targets(ID
3D
10Device* d
3d
10) { // Clearing every frame is a good practice for SLI. By clearing surfaces, you indicate to the // driver that information from the previous frame is not needed by the other GPU(s) involved // in
render
ing. float ClearColor[4] = { 0.0, 0.0, 0.5, 0.0 }; ID
3D
10
Render
TargetView* pRTV = DXUTGetD
3D
10
Render
TargetView(); d
3d
10->Clear
Render
TargetView(pRTV, ClearColor); ID
3D
10DepthStencilView* pDSV = DXUTGetD
3D
10DepthStencilView(); d
3d
10->ClearDepthStencilView(pDSV, D
3D
10_CLEAR_DEPTH, 1.0, 0); } // ------------------------------------------------------------------------------------------------ void
Render
World(ID
3D
10Device* d
3d
10, double fTime, float fElapsedTime) { // Give the active scene a shot at
render
ing the world. gScenes[gActiveScene]->
Render
(d
3d
10); } // ------------------------------------------------------------------------------------------------ void
Render
Text
() { //
Render
common
text
, then give the active scene a chance to display
text
information // about itself. gTxtHelper->Begin(); gTxtHelper->SetInsertionPos(8, 8); gTxtHelper->SetForegroundColor(D
3D
XCOLOR(1.0f, 1.0f, 0.0f, 1.0f)); gTxtHelper->Draw
Text
Line(L""); gTxtHelper->Draw
Text
Line(L""); gTxtHelper->Draw
Text
Line(L""); gTxtHelper->Draw
Text
Line(DXUTGetFrameStats(true)); gTxtHelper->Draw
Text
Line(DXUTGetDeviceStats()); bool stereoActive = gStereoTexMgr->IsStereoActive(); if (stereoActive) { gTxtHelper->Draw
Text
Line(L"Stereo Active"); } else { gTxtHelper->SetForegroundColor(D
3D
XCOLOR(1.0f, 0.2f, 0.2f, 1.0f)); gTxtHelper->Draw
Text
Line(L"Stereo is currently disabled--you should see no differences between techniques."); gTxtHelper->SetForegroundColor(D
3D
XCOLOR(1.0f, 0.5f, 0.0f, 1.0f)); } gScenes[gActiveScene]->
Render
Text
(gTxtHelper, stereoActive); gTxtHelper->End(); } // ------------------------------------------------------------------------------------------------ void
Render
Cursor(ID
3D
10Device* d
3d
10) { // Cursor
render
ing is handled by the active scene. // Cursors need a bit of stereo love, so the scenes handle that. gScenes[gActiveScene]->
Render
Cursor(d
3d
10); } // ------------------------------------------------------------------------------------------------ void
Render
HUD(ID
3D
10Device* d
3d
10, double fTime, float fElapsedTime) {
Render
Text
(); gUI.On
Render
( fElapsedTime ); //
Render
the cursor last for the obvious reason that we want it to appear above everything // else
Render
Cursor(d
3d
10); } // ------------------------------------------------------------------------------------------------ HRESULT CreateStereoParam
Text
ureAndView(ID
3D
10Device* d
3d
10) { // This function creates a
text
ure that is suitable to be stereoized by the driver. // Note that the parameters primarily come from nvstereo.h using nv::stereo::Param
Text
ureManagerD
3D
10; HRESULT hr = D
3D
_OK; D
3D
10_
TEXT
URE2D_DESC desc; desc.Width = Param
Text
ureManagerD
3D
10::Parms::StereoTexWidth; desc.Height = Param
Text
ureManagerD
3D
10::Parms::StereoTexHeight; desc.MipLevels = 1; desc.ArraySize = 1; desc.Format = Param
Text
ureManagerD
3D
10::Parms::StereoTexFormat; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D
3D
10_USAGE_DYNAMIC; desc.BindFlags = D
3D
10_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = D
3D
10_CPU_ACCESS_WRITE; desc.MiscFlags = 0; V_RETURN(d
3d
10->Create
Text
ure2D(&desc;, NULL, &gStereoParam
Text
ure;)); // Since we need to bind the
text
ure to a shader input, we also need a resource view. D
3D
10_SHADER_RESOURCE_VIEW_DESC descRV; descRV.Format = desc.Format; descRV.ViewDimension = D
3D
10_SRV_DIMENSION_
TEXT
URE2D; descRV.
Text
ure2D.MipLevels = 1; descRV.
Text
ure2D.MostDetailedMip = 0; descRV.
Text
ure2DArray.MostDetailedMip = 0; descRV.
Text
ure2DArray.MipLevels = 1; descRV.
Text
ure2DArray.FirstArraySlice = 0; descRV.
Text
ure2DArray.ArraySize = desc.ArraySize; V_RETURN(d
3d
10->CreateShaderResourceView(gStereoParam
Text
ure, &descRV;, &gStereoParam
Text
ureRV;)); return hr; } // ------------------------------------------------------------------------------------------------ bool CALLBACK IsD
3D
10DeviceAcceptable(UINT Adapter, UINT Output, D
3D
10_DRIVER_TYPE DeviceType, DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserCon
text
) { // Only accept hardware devices return DeviceType == D
3D
10_DRIVER_TYPE_HARDWARE; } // ------------------------------------------------------------------------------------------------ HRESULT CALLBACK OnD
3D
10CreateDevice(ID
3D
10Device* d
3d
10, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserCon
text
) { HRESULT hr = D
3D
_OK; V_RETURN(gDialogResourceManager.OnD
3D
10CreateDevice(d
3d
10)); V_RETURN(D
3D
X10CreateFont(d
3d
10, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Verdana", &gFont10;)); V_RETURN(D
3D
X10CreateSprite(d
3d
10, 512, &gSprite10;)); gTxtHelper = new CDXUT
Text
Helper(NULL, NULL, gFont10, gSprite10, 15); // Create our stereo parameter
text
ure V_RETURN(CreateStereoParam
Text
ureAndView(d
3d
10)); // Initialize the stereo
text
ure manager. Note that the Stereo
Text
ureManager was created // before the device. This is important, because NvAPI_Stereo_CreateConfigurationProfileRegistryKey // must be called BEFORE device creation. gStereoTexMgr->Init(d
3d
10); // Give each of our scenes a chance to load their resources. for (std::vector
::iterator it = gScenes.begin(); it != gScenes.end(); ++it) { (*it)->SetStereoParamRV(gStereoParam
Text
ureRV); V_RETURN((*it)->LoadResources(d
3d
10)); } return hr; } // ------------------------------------------------------------------------------------------------ void CALLBACK OnD
3D
10DestroyDevice(void* pUserCon
text
) { // Clean everything up. gDialogResourceManager.OnD
3D
10DestroyDevice(); for (std::vector
::iterator it = gScenes.begin(); it != gScenes.end(); ++it) { (*it)->UnloadResources(); } SAFE_RELEASE(gStereoParam
Text
ureRV); SAFE_RELEASE(gStereoParam
Text
ure); SAFE_DELETE(gStereoTexMgr); SAFE_RELEASE(gFont10); SAFE_RELEASE(gSprite10); SAFE_DELETE(gTxtHelper); } // ------------------------------------------------------------------------------------------------ HRESULT CALLBACK OnD
3D
10ResizedSwapChain(ID
3D
10Device* d
3d
10, IDXGISwapChain *pSwapChain, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserCon
text
) { HRESULT hr = D
3D
_OK; V_RETURN(gDialogResourceManager.OnD
3D
10ResizedSwapChain(d
3d
10, pBackBufferSurfaceDesc)); // All scenes need a chance to handle the resize. for (std::vector
::iterator it = gScenes.begin(); it != gScenes.end(); ++it) { (*it)->OnD
3D
10ResizedSwapChain(d
3d
10, pSwapChain, pBackBufferSurfaceDesc); } gUI.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 ); gUI.SetSize( 170, 170 ); return hr; } // ------------------------------------------------------------------------------------------------ void CALLBACK
Render
(ID
3D
10Device* d
3d
10, double fTime, float fElapsedTime, void* pUserCon
text
) { // First, we update our stereo
text
ure gStereoTexMgr->UpdateStereo
Text
ure(d
3d
10, gStereoParam
Text
ure, false); // Then, we tell the scene what the current convergence depth is. Cursor
render
ing // uses this information to cause the cursor to draw at screen depth if the cursor // isn't currently over an object in the scene. gScenes[gActiveScene]->SetConvergenceDepth(gStereoTexMgr->GetConvergenceDepth()); // Then, clear our
render
targets,
render
the world and finish with the hud. Clear
Render
Targets(d
3d
10);
Render
World(d
3d
10, fTime, fElapsedTime);
Render
HUD(d
3d
10, fTime, fElapsedTime); } // ------------------------------------------------------------------------------------------------ void CALLBACK OnD
3D
10ReleasingSwapChain(void* pUserCon
text
) { gDialogResourceManager.OnD
3D
10ReleasingSwapChain(); } // ------------------------------------------------------------------------------------------------ bool CALLBACK ModifyDeviceSettings(DXUTDeviceSettings* pDeviceSettings, void* pUserCon
text
) { if (pDeviceSettings->ver == DXUT_D
3D
10_DEVICE) { #if _DEBUG // Set debug if debugging. In debug, run aliased mode because // otherwise DXUT deletes a target while bound, causing many, many // spew messages. pDeviceSettings->d
3d
10.CreateFlags |= D
3D
10_CREATE_DEVICE_DEBUG; pDeviceSettings->d
3d
10.sd.SampleDesc.Count = 1; #else // I like AA, so turn it on here. pDeviceSettings->d
3d
10.sd.SampleDesc.Count = 4; #endif pDeviceSettings->d
3d
10.sd.SampleDesc.Quality = 0; } return true; } // ------------------------------------------------------------------------------------------------ LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserCon
text
) { // WM_MOUSEMOVE needs to make it to the active scene to draw the cursor in the right place. *pbNoFurtherProcessing = gDialogResourceManager.MsgProc(hWnd, uMsg, wParam, lParam); if( *pbNoFurtherProcessing && uMsg != WM_MOUSEMOVE) return 0; // Again, make sure that WM_MOUSEMOVE makes it to the active scene, otherwise the mouse will // freeze when it's over our GUI elements, making it significantly less useful. *pbNoFurtherProcessing = gUI.MsgProc(hWnd, uMsg, wParam, lParam); if( *pbNoFurtherProcessing && uMsg != WM_MOUSEMOVE) return 0; // Pass all remaining windows messages to camera so it can respond to user input if (gActiveScene != cNoActiveScene) { return gScenes[gActiveScene]->HandleMessages(hWnd, uMsg, wParam, lParam); } return 0; } // ------------------------------------------------------------------------------------------------ void CALLBACK Update(double fTime, float fElapsedTime, void* pUserCon
text
) { // Only the active scene gets the update gScenes[gActiveScene]->Update(fTime, fElapsedTime); } // ------------------------------------------------------------------------------------------------ void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserCon
text
) { switch( nControlID ) { case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break; case IDC_MENU: default: // All other messages need to be given to all scenes, in case they need to handle // them. for (std::vector
::iterator it = gScenes.begin(); it != gScenes.end(); ++it) { (*it)->OnGUIEvent(nEvent, nControlID, pControl, pUserCon
text
); } } } // ------------------------------------------------------------------------------------------------ void InitUI() //UI User Interface 用户界面 { gUI.Init(&gDialogResourceManager;); int y = 10; gUI.SetCallback(OnGUIEvent); gUI.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, y, 125, 22 ); gUI.AddButton(IDC_MENU,L"Menu",-1024,y,125,22); y += 24; int startId = IDC_TOGGLEFULLSCREEN + 1; for (std::vector
::iterator it = gScenes.begin(); it != gScenes.end(); ++it) { (*it)->InitUI(gUI, 35, y, startId); } } // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) { HRESULT hr; V_RETURN(DXUTSetMediaSearchPath(L"..\\Source\\StereoIssues")); // Set Direct
3D
10 callbacks. This sample won't work with Dx9, so don't bother setting any of // those. 设置 Direct
3D
10回调信号 DXUTSetCallbackD
3D
10DeviceAcceptable(IsD
3D
10DeviceAcceptable); DXUTSetCallbackD
3D
10DeviceCreated(OnD
3D
10CreateDevice); DXUTSetCallbackD
3D
10SwapChainResized(OnD
3D
10ResizedSwapChain); DXUTSetCallbackD
3D
10Frame
Render
(
Render
); DXUTSetCallbackD
3D
10SwapChainReleasing(OnD
3D
10ReleasingSwapChain); DXUTSetCallbackD
3D
10DeviceDestroyed(OnD
3D
10DestroyDevice); // Set the generic callback functions 设置通用的回调函数 DXUTSetCallbackDeviceChanging(ModifyDeviceSettings); DXUTSetCallbackMsgProc(MsgProc); DXUTSetCallbackFrameMove(Update); // We'll deal with our own cursor in fullscreen mode. DXUTSetCursorSettings(false, false); // Needs to be called before any other NVAPI functions, so before device creation is fine. NvAPI_Initialize(); // Param
Text
ureManager must be created before the device to give our settings-loading code a chance to fire. gStereoTexMgr = new nv::stereo::Param
Text
ureManagerD
3D
10; gScenes.push_back(new StanfordBunnyScene); gActiveScene = 0; InitUI(); // UI用户界面 // Initialize DXUT and create the desired Win32 window and Direct
3D
device for the application DXUTInit(true, true); // Stereo is a Vista/Win7 feature for Dx9 and Dx10. One of the restrictions is that it only works // in fullscreen mode, but it's useful to debug and place breakpoints in windowed mode. // In any event, there is a button in the sample to toggle to fullscreen if needed, this only // controls the starting state of the app. bool windowed = false; #ifdef _DEBUG windowed = true; #endif DXUTCreateWindow(L"Stereo Issues"); DXUTCreateDevice(windowed); // Start the
render
loop 开始DXUT主要渲染循环 DXUTMainLoop(); int retval = DXUTGetExitCode(); // Clean everything up DXUTShutdown(retval); // We no longer have an active scene. gActiveScene = cNoActiveScene; // No memory leaks! for (std::vector
::iterator it = gScenes.begin(); it != gScenes.end(); ++it) { SAFE_DELETE(*it); } return retval; }
动态CubeMapping
D
3D
11
使用
Cube Mapping技术实现动态的环境贴图、物表反射、天空盒。
游戏开发
8,325
社区成员
23,685
社区内容
发帖
与我相关
我的任务
游戏开发
游戏开发相关内容讨论专区
复制链接
扫一扫
分享
社区描述
游戏开发相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章