火
火龙真人
Unregistered / Unconfirmed
GUEST, unregistred user!
该文是关于如何从前台缓冲区中读取数据并在DirectX 8.1中得到屏幕截图。这仅是获得带有反走样屏幕截图的方法的其中一种。此方法非常值得推荐,但在读此文之前,你应该对C++与DirectX 8有很好的理解(但不是必要的)。
现在,我们以回顾双缓冲区的工作原理作为起点,假如这些东西你已经熟透,大可跳过这个段落。在今天,差不多所有的游戏使用名为双缓冲区的技术将游戏数据发送到屏幕上。绘制当前屏幕的工作都在离屏内存区内完成,例如象大家都知道的后台缓冲区。后台缓冲区的绘制工作完成后,然后切换或交换到可见缓冲区(前台缓冲区)。当切换/交换出现后至帧完成结束。三重缓冲区也是如此,它与双缓冲区之间仅有一个不同之处,三重缓冲区使用两个离屏内存区而不是一个。
void TakeScreenShot(IDirect3DDevice8* device, char* file_name, int screenx, int screeny)
{
IDirect3DSurface8* frontbuf; // this is our pointer to the memory location containing our copy of the
// front buffer
// now we create the image that our screen shot will be copied into
// NOTE: Surface format of the front buffer is D3DFMT_A8R8G8B8 when it is returned
device->CreateImageSurface(screenx, screeny, D3DFMT_A8R8G8B8, &frontbuf);
// now we copy the front buffer into our surface
HRESULT hr = device->GetFrontBuffer(frontbuf);
// error checking
if(hr != D3D_OK)
{
// do error handling etc...
frontbuf->Release(); // release the surface so there is no memory leak
return;
}
// now write our screen shot to a bitmap file
// the last 2 params are NULL because we want the entire front buffer and no palette
D3DXSaveSurfaceToFile(file_name, D3DXIFF_BMP, frontbuf, NULL, NULL);
// release the surface so there is no memory leak
frontbuf->Release();
}
在更进步一点,你可以变化这些方式。你可以在前台缓冲区的拷贝数据写到一个文件之前,在图像中加入你的水印(图像)处理过程(例如将你公司的标识水印粘到图像中)。如果你有任何问题,
或想了解注解,或者发现错误,请您通过电子邮件与我联系
现在,我们以回顾双缓冲区的工作原理作为起点,假如这些东西你已经熟透,大可跳过这个段落。在今天,差不多所有的游戏使用名为双缓冲区的技术将游戏数据发送到屏幕上。绘制当前屏幕的工作都在离屏内存区内完成,例如象大家都知道的后台缓冲区。后台缓冲区的绘制工作完成后,然后切换或交换到可见缓冲区(前台缓冲区)。当切换/交换出现后至帧完成结束。三重缓冲区也是如此,它与双缓冲区之间仅有一个不同之处,三重缓冲区使用两个离屏内存区而不是一个。
void TakeScreenShot(IDirect3DDevice8* device, char* file_name, int screenx, int screeny)
{
IDirect3DSurface8* frontbuf; // this is our pointer to the memory location containing our copy of the
// front buffer
// now we create the image that our screen shot will be copied into
// NOTE: Surface format of the front buffer is D3DFMT_A8R8G8B8 when it is returned
device->CreateImageSurface(screenx, screeny, D3DFMT_A8R8G8B8, &frontbuf);
// now we copy the front buffer into our surface
HRESULT hr = device->GetFrontBuffer(frontbuf);
// error checking
if(hr != D3D_OK)
{
// do error handling etc...
frontbuf->Release(); // release the surface so there is no memory leak
return;
}
// now write our screen shot to a bitmap file
// the last 2 params are NULL because we want the entire front buffer and no palette
D3DXSaveSurfaceToFile(file_name, D3DXIFF_BMP, frontbuf, NULL, NULL);
// release the surface so there is no memory leak
frontbuf->Release();
}
在更进步一点,你可以变化这些方式。你可以在前台缓冲区的拷贝数据写到一个文件之前,在图像中加入你的水印(图像)处理过程(例如将你公司的标识水印粘到图像中)。如果你有任何问题,
或想了解注解,或者发现错误,请您通过电子邮件与我联系