DX 绘制位图
简单地学习了四个API:
HRESULT CreateOffscreenPlainSurface(
[in] UINT Width, // 宽度
[in] UINT Height, // 高度
[in] D3DFORMAT Format, // 像素格式
[in] D3DPOOL Pool, // 内存池类型
[out, retval] IDirect3DSurface9 **ppSurface, // 返回的表面的指针
[in] HANDLE *pSharedHandle // 一般为NULL
);
HRESULT GetBackBuffer(
[in] UINT iSwapChain, // 交换链索引,0为默认的交换链
[in] UINT BackBuffer, // 后备缓冲索引,从0开始,指定要得到的后备缓冲
[in] D3DBACKBUFFER_TYPE Type, // DX只支持D3DBACKBUFFER_TYPE_MONO
[out, retval] IDirect3DSurface9 **ppBackBuffer// 返回的指针
);
HRESULT ColorFill(
[in] IDirect3DSurface9 *pSurface, // 要填充的表面
[in] const RECT *pRect, // 填充的矩形
[in] D3DCOLOR color // 填充的颜色
);
HRESULT StretchRect(
[in] IDirect3DSurface9 *pSourceSurface, // 源表面
[in] const RECT *pSourceRect, // 源表面的矩形
[in] IDirect3DSurface9 *pDestSurface, // 目的表面
[in] const RECT *pDestRect, // 目的表面的矩形
[in] D3DTEXTUREFILTERTYPE Filter // 过滤
);
#include <windows.h>
#include <d3dx9.h> #define SCREEN_W 800
#define SCREEN_H 600
#define APPNAME "myGame"
#define CLASSNAME "wndClass" IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDev = NULL;
IDirect3DSurface9* pSur = NULL;
IDirect3DSurface9* pBackSur = NULL; #define SAFE_RELEASE(p) \
if (p) { \
p->Release(); \
p = NULL; \
} LRESULT WINAPI WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch (msg)
{
// case WM_PAINT:
// {
// BeginPaint(hWnd,&ps);
// EndPaint(hWnd,&ps);
// return 0;
// }
case WM_DESTROY:
{
PostQuitMessage();
return ;
}
} return DefWindowProc(hWnd,msg,wParam,lParam);
}
void initWndClass(HINSTANCE hInstance,WNDCLASSEX &wndClass)
{
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = ;
wndClass.cbWndExtra = ;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.lpszClassName = TEXT(CLASSNAME);
wndClass.lpszMenuName = NULL;
wndClass.hIconSm = LoadIcon(NULL,IDI_WINLOGO);
} bool initD3D(HWND hWnd)
{ // 主要目的是获取设备,为调用下面的函数做很多准备。
// 比如 获取IDirect3D9 ,获取支持的顶点处理,填充后备缓冲相关参数等。 // IDirect3D9::CreateDevice(
//UINT Adapter,
//D3DDEVTYPE DeviceType,
//HWND hFocusWindow,
//DWORD BehaviorFlags,
//D3DPRESENT_PARAMETERS *pPresentationParameters,
//IDirect3DDevice9 ** ppReturnDeviceInterface
//); // 第一步 获取 IDirect3D9 接口
// Direct3DCreate9(D3D_SDK_VERSION);
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (NULL == pD3D)
{
MessageBox(NULL,TEXT("NULL == pD3D"),NULL,MB_OK);
return false;
}
// 第二步 确定显卡是否支持顶点转换和光照
// 通过获取设备性能,里面包含顶点处理,纹理,shader等信息。
// pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)
// caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT
D3DCAPS9 caps;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps); int vp = ;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
} // 第三步 填充显示参数,主要是和后备缓冲相关的设置。
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.BackBufferCount = ;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferHeight = SCREEN_H;
d3dpp.BackBufferWidth = SCREEN_W;
d3dpp.EnableAutoDepthStencil = true;
//d3dpp.FullScreen_RefreshRateInHz = 0; // 屏幕刷新频率,默认值即可
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // 屏幕刷新频率,默认值即可
d3dpp.Windowed = true;
d3dpp.hDeviceWindow = hWnd; // 窗口句柄。
d3dpp.MultiSampleQuality = ;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
//d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
// D3DPRESENT_INTERVAL_IMMEDIATE 图形绘制完后立即显示,实时的,可以提高帧率,但过快会产生图形撕裂。
// D3DPRESENT_INTERVAL_DEFAULT 则需等待屏幕刷新完后绘制
d3dpp.Flags = ; // 附加特性一般为0. // d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 这个一定要赋值(即使初始化为0),枚举值从1开始
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; // 这个一定要赋值(即使初始化为0),枚举值从1开始
//d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; // 这个一定要赋值(即使初始化为0),枚举值从1开始
// 使用FLIP 屏幕有很强的抖动,难道是交换链的切换和显示不同步所致??。
// // 第四步 创建设备。 // IDirect3D9::CreateDevice(
//UINT Adapter,
//D3DDEVTYPE DeviceType,
//HWND hFocusWindow,
//DWORD BehaviorFlags,
//D3DPRESENT_PARAMETERS *pPresentationParameters,
//IDirect3DDevice9 ** ppReturnDeviceInterface
//); pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
vp,
&d3dpp,
&pD3DDev
); if (NULL == pD3DDev)
{
MessageBox(NULL,TEXT("NULL == pD3DDev"),NULL,MB_OK);
return false;
} return true;
} void Release()
{
SAFE_RELEASE(pD3D);
SAFE_RELEASE(pD3DDev);
SAFE_RELEASE(pSur);
SAFE_RELEASE(pBackSur);
} void initSurface()
{
if (pD3DDev)
{
pD3DDev->CreateOffscreenPlainSurface(
,,D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&pSur,
NULL);
pD3DDev->GetBackBuffer(,,D3DBACKBUFFER_TYPE_MONO,&pBackSur);
// GetBackBuffer()得到的是后备缓冲表面的指针。
pD3DDev->Clear(,,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(,,,),1.0, );
}
}
void Render()
{
if (pD3DDev)
{
//pD3DDev->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,0),1.0,0 ); pD3DDev->ColorFill(pSur,NULL,D3DCOLOR_ARGB(,rand() % ,rand() % ,rand() % )); // 目的表面随机一个矩形
RECT rect;
rect.left = rand() % SCREEN_W;
rect.top = rand() % SCREEN_H;
rect.right = rect.left + rand() % (SCREEN_W - rect.left);
rect.bottom = rect.top + rand() % (SCREEN_H - rect.top); pD3DDev->BeginScene(); if (pSur && pBackSur)
{
pD3DDev->StretchRect(pSur,NULL,pBackSur,&rect,D3DTEXF_NONE);
// StretchRect()
// 它要求源和目的表面的内存池类型为D3DPOOL_DEFAULT。
// 并且不能再同一表面操作:。
} pD3DDev->EndScene();
pD3DDev->Present(,,,);
}
} int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
HWND hWnd; WNDCLASSEX wndClass;
initWndClass(hInstance,wndClass); RegisterClassEx(&wndClass); hWnd = CreateWindow(
TEXT(CLASSNAME),
TEXT(APPNAME),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
SCREEN_W,
SCREEN_H,
NULL,
NULL,
hInstance,
NULL
); if (NULL == hWnd)
{
MessageBox(NULL,TEXT("NULL == hWnd"),NULL,MB_OK);
return ;
} if (!initD3D(hWnd))
{
MessageBox(NULL,TEXT("initD3D"),NULL,MB_OK);
Release();
return ;
} initSurface(); UpdateWindow(hWnd);
ShowWindow(hWnd,nShowCmd);
MSG msg;
while (true)
{
if ( PeekMessage(&msg,NULL,,,PM_REMOVE) )
{
if (WM_QUIT == msg.message)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
Release();
return msg.lParam;
}
DX 绘制位图的更多相关文章
- Delphi GDI对象之绘制位图
http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难, ...
- DX笔记之五------游戏画面绘图之绘制位图
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7335103 共四步 步骤一:加载位图 步骤二:建立与 ...
- Win10系列:VC++绘制位图图片
在使用Direct2D绘制图片的过程中,通过IWICImagingFactory工厂接口来得到绘制图片所需要的资源.本小节将介绍如何通过IWICImagingFactory工厂接口得到这些资源,并使用 ...
- 【emWin】例程八:绘制位图
实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1bpeMYpp 密码:wgtp 实验现象:
- 使用DX绘制3D物体时新手常犯错误,看不见物体时可以一一排查
1.镜头不对: 物体不在镜头范围内,检查视图矩阵,世界矩阵,投影矩阵. 2.颜色全黑: 打开光照情况下,MATERIAL全为0, 或,在没有打开光照情况下,颜色值为0,造成全黑.检查当前Materia ...
- 如何将内存中的位图数据绘制在DC上
假如你定义了一个位图类,里面包含位图头,位图信息头,调色板,位图数据.然后你按照位图的格式将位图文件读入你的类中,现在你知道了位图的全部信息了.主要信息包含在位图信息头里面,数据则在位图数据缓冲里面. ...
- UWP 手绘视频创作工具技术分享系列 - 位图的绘制
前面我们针对 SVG 的解析和绘制做了介绍,SVG 是图片的一种形式,而另一种很重要的图片是:位图,包括 png.jpeg.bmp 等格式.位图的基本规则是,组成的基本元素是像素点,由宽度 * 高度个 ...
- SharpDX之Direct2D教程II——加载位图文件和保存位图文件
本系列文章目录: SharpDX之Direct2D教程I——简单示例和Color(颜色) 绘制位图是绘制操作的不可缺少的一部分.在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再 ...
- UWP开发细节记录:加载图像文件到D2D位图和D3D纹理
在UWP中加载文件一般先创建 StorageFile 对象,然后调用StorageFile.OpenReadAsync 方法得到一个IRandomAccessStream 接口用来读取数据: Stor ...
随机推荐
- UVALive 3645 Objective: Berlin(最大流 :时序模型)
题意:已知n(n <= 150)个城市和m(m <= 5000)个航班,每个航班有出发地.到达地.乘坐人数.起飞时间和降落时间(时间用时和分表示),求从一个指定城市出发,去往另一个指定城市 ...
- windows下nginx以服务自启动
1,下载最新版的 Windows Service Wrapper 程序,例如:"winsw-1.9-bin.exe" 也可以修改它的名字,例如:myapp.exe 2, 将重命名后 ...
- myeclipse 的 working set
想必大家的myeclipse会有很多工程看的和不方便,那么怎么让它看的简洁一点呢,使用working set 会让你的目录看起来没有那么的多. 首先是怎么创建 working set ,在新建时选择 ...
- json-lib-2.4.jar Bug,json字符串中value为"[value]"结构时,解析为数组,不会解析成字符串
使用json-lib.jar 2.4进行json字符串转换为对象时发现一个bug.贴下测试代码: <dependency> <groupId>net.sf.json-lib&l ...
- DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾
#### DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾 #### <style type="text/css"> .test_box { width ...
- Apache+PHP+MySql 的安装及配置
每一项技术用的人多了,就会有人将其进行优化,做成一个简单.实用.大众化的工具,这对于初识者来说是非常方便的,但是对于长久学习或工作这方面的人技术人员来说是不可取的,所以还是要学习基础的实用方法.因此, ...
- nginx如何实现404状态返回 200隐藏URL
以http://WWW.cnblogs.COM为例: server { listen 80; server_nam ...
- AngularJS快速开始
Hello World! 开始学习AngularJS的一个好方法是创建经典应用程序“Hello World!”: 使用您喜爱的文本编辑器,创建一个HTML文件,例如:helloworld.html. ...
- ShowMask
<html> <head> <script type="text/javascript"> function showMask(){ var a ...
- VB.Net 文件处理类
1.编写日志 2.本地文件的读取和写入 3.Base64与图片的互相转换 Imports System.IO Imports System.Text Public Class Cls_File #Re ...