【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2964|回复: 8

[原创]对初学者有帮助的初始化D3D详细代码(各行都有解释)

[复制链接]
发表于 2009-1-10 22:53:40 | 显示全部楼层 |阅读模式

//////////////////////////////////////////////////////////////////////////

//D3D全注释例子//  25期 翟勇//    [1/7/2009 Administrator]

//////////////////////////////////////////////////////////////////////////

#include <d3dx9.h>

#include <d3d9.h>

//////////////////////////////////////////////////////////////////////////

//全局变量

//////////////////////////////////////////////////////////////////////////

LPDIRECT3D9 g_D3D = NULL;    //Direct3D对象

LPDIRECT3DDEVICE9 g_d3dDevice = NULL; //Direct3D设备对象

HWND hWnd;   // 窗口句柄

WNDCLASSEX g_wc; // 向系统声明窗口类

HINSTANCE hInst; // 窗口实例句柄.Windows设置这个参数的值并把它传递给应用程序,很多Windows函数都要用它

//////////////////////////////////////////////////////////////////////////

//声明

//////////////////////////////////////////////////////////////////////////

ATOM RegisterWndClass(HINSTANCE hInstance);  //注册窗口类

BOOL InitWnd(HINSTANCE hInstance,INT nCmdL); // 创建窗口、显示窗口、更新窗口

LRESULT WINAPI MagProc(HWND,UINT,WPARAM,LPARAM); //消息处理函数

HRESULT InitialD3D( HWND hWnd );  //初始化D3DVOID Clean();       //释放创建对象

VOID Rend();       //绘制方法

VOID Msgg();       //消息处理

//////////////////////////////////////////////////////////////////////////

//程序入口

//////////////////////////////////////////////////////////////////////////

INT WINAPI WinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance,  LPSTR lpCmdLine,  int nCmdShow)

{ if(!hPrevInstance)       // 判断是否有同一个应用程序正在运行 

{  RegisterWndClass(hInstance); }

if(!InitWnd(hInstance,nCmdShow))   // 初始化窗口 

{  return FALSE; }
 InitialD3D(hWnd );       // 初始化

D3D
 Msgg();          // 调用 游戏循环的方法

Clean();         // 调用 释放资源的方法 

UnregisterClass( L"D3D", //注销的类名字符串指针     

hInstance );//应用程序句柄  // 注销窗口类函数

return 0;         // 程序结束}

//////////////////////////////////////////////////////////////////////////

//实现定义声明方法

//注册窗口

//////////////////////////////////////////////////////////////////////////

ATOM RegisterWndClass(HINSTANCE hInstance)

{ g_wc.cbSize=sizeof(WNDCLASSEX);  // 说明WNDCLASSEX结构体的大小,单位为字节 

g_wc.style = CS_CLASSDC;   // 指定窗口的风格 

g_wc.lpfnWndProc=(WNDPROC)MagProc; // 指向消息处理函数的指针

 g_wc.cbClsExtra= 0L;    // 额外参数一般初始化为0 

g_wc.cbWndExtra=0L;     // 额外参数一般初始化为0 

g_wc.hInstance=hInstance;   // 说明该窗口类的窗口实例句柄 

g_wc.hIcon=NULL;     // 窗口左上角的图标(第二个参数为图标的名称或者图标的资源ID) 

g_wc.hCursor=NULL;     // 设置窗口内所显示的光标句柄 

g_wc.hbrBackground=NULL;   // 设置窗口的背景色,这里设置成空 

g_wc.lpszMenuName=NULL;    // 指定窗口菜单资源的指针 

g_wc.lpszClassName=L"ClassName"; // 设定窗口类的名字 

g_wc.hIconSm=NULL;     // 任务栏图标

RegisterClassEx(&g_wc); 

return S_OK; }

//////////////////////////////////////////////////////////////////////////

//创建窗口//////////////////////////////////////////////////////////////

////////////

BOOL InitWnd(HINSTANCE hInstance,INT nCmdL)

{ hWnd = CreateWindow(L"ClassName",   // 注册窗口类名字

      L"小试牛刀",   // 窗口的名称      

WS_OVERLAPPEDWINDOW , // 窗口的风格

      100,     // 窗口左上角的X方向 

     200,     // 窗口左上角的Y方向  

    500,     // 窗口的宽度 

     500,     // 窗口的高度     

 NULL,     // 父窗口的 句柄    

  NULL,     // 菜单句柄   

   hInstance,    // 当前应用程序的实例句柄   

   NULL);     // 窗口的附加参数

if(!hWnd)         // 如果窗口创建失败,则此函数返回值为FALSE 

{  return FALSE; }

ShowWindow(hWnd,nCmdL);      // 显示窗口

 UpdateWindow(hWnd);       // 更新窗口 

 return TRUE;}

//////////////////////////////////////////////////////////////////////////

//消息处理函数//////////////////////////////////////////////////////////

////////////////

LRESULT WINAPI MagProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

switch (message)

 {

   case WM_DESTROY:  

  PostQuitMessage(0);  

   break; } 

  return DefWindowProc(hWnd, message, wParam, lParam);

}

///////////////////////////////////////////////////////////////////////////

//初始化D3D/////////////////////////////////////////////////////////////

/////////////

HRESULT InitialD3D( HWND hWnd )

{ g_D3D =Direct3DCreate9(D3D_SDK_VERSION);//记住背过每次都这样写的

 if (g_D3D == NULL) {  //消息盒子  

MessageBox(NULL,//把消息装入盒子 一般为NULL 

      L"failed d3d",//指定终结的名字   

    L"aa",//指定终结对话筐名字

       0); //指定内容到对话筐

   MB_***  return E_FAIL; }

/*typedef struct D3DPRESENT_PARAMETERS {  UINT BackBufferWidth, BackBufferHeight;  D3DFORMAT BackBufferFormat;  UINT BackBufferCount;  D3DMULTISAMPLE_TYPE MultiSampleType;  DWORD MultiSampleQuality;  D3DSWAPEFFECT SwapEffect;  HWND hDeviceWindow;  BOOL Windowed;  BOOL EnableAutoDepthStencil;  D3DFORMAT AutoDepthStencilFormat;  DWORD Flags;  UINT FullScreen_RefreshRateInHz;  UINT PresentationInterval; } D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS; BackBufferWindth 指定后台缓冲区(BackBuffer)的宽度 BackBufferHeight 指定后台缓冲区(BackBuffer)的高度 BackBufferFormat 指定后台缓冲区的象素格式 详细参数见帮助文档 D3DFMT_*** BackBufferCount  指定后台缓冲区数量 MultiSampleType  指定多重采样类型,用于图形反锯齿 SwapEffect       指定系统如何将后台缓冲区的内容复制到前台缓冲区 D3DSWAPEFFECT_*** hDeviceWindow    指定图形绘制窗口 如为NULL,则通行绘制窗口为当前被激活的窗口 Windowed         表示图形是以窗口还是全平屏显示 TRUE是窗口 FALSE是全屏 EnableAutoDepthStencil  表示是否创建深度缓冲区 AutoDepthStencilFormat 深度缓冲区格式  D3DFMT_*** Flags            请参考D3DPRESENTFLAG通常为0 FullScreen_RefreshRateInHz 指定显示器刷新率 必须为0 resentationInterval 指定后台缓存与前台缓存的最大交换频率,可取D3DPRESENT常量中一个   根据需要选择上面内容*/ D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed =TRUE; d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
 
 /*HRESULT CreateDevice(  UINT Adapter,  D3DDEVTYPE DeviceType,  HWND hFocusWindow,  DWORD BehaviorFlags,  D3DPRESENT_PARAMETERS * pPresentationParameters,  IDirect3DDevice9 ** ppReturnedDeviceInterface  );  Adapter       指定显卡序号,表示使用哪块显卡创建Direct3D设备对象,通常设置D3DADAPTER_DEFAULT  DeviceType    指定Direct3D设备类型  D3DDEVTYPE_**  hFocusWindow  指定当Direct3D程序从前台变换到后台时的提示窗口  BehaviorFlag  (设备行为标志)指定Direct3D设备进行3D运算的工作方式 D3DCREATE_**  pPresntationParameters 指向一个结构体D3DPRESENT_PARAMETERS*/ if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,  D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_d3dDevice))) {  return E_FAIL; } return S_OK;}
////////////////////////////////////////////////////////////////////////////释放对象//////////////////////////////////////////////////////////////////////////VOID Clean(){ if (g_d3dDevice!=NULL) {  g_d3dDevice->Release(); } if (g_D3D!=NULL) {  g_D3D->Release(); }}
////////////////////////////////////////////////////////////////////////////渲染图形//////////////////////////////////////////////////////////////////////////VOID Rend(){ /*HRESULT Clear(  DWORD Count,  CONST D3DRECT * pRects,  DWORD Flags,  D3DCOLOR Color,  float Z,  DWORD Stencil  );  Count 指定参数pRect指向的矩形数组中矩形的数量 如果pRect设置为NULL则必须为0否则非0  pRect 指向D3DRECT结构数组的指针  Flags 指定需要清空的缓冲区 可以3种任意组合 D3DCLEAR_TARGET(颜色缓冲)D3DCLEAR_ZBUFFER(深度缓冲)D3DCLEAR_STENCIL(模板缓冲)  Color 指定清空颜色缓冲区后颜色缓冲区中每个象素对应的颜色值 D3DCOLOR_**  Z     指定清空深度缓冲区后深度缓冲区中每个象素对应的深度值  Stencil 指定晴空模板缓冲区后模板缓冲区中每个象素对应的模板值*/ g_d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,180),1.0f,0);
 g_d3dDevice->BeginScene(); //开始绘制 g_d3dDevice->EndScene();   //结束绘制
 g_d3dDevice->resent(NULL,NULL,NULL,NULL);//记住就行}
////////////////////////////////////////////////////////////////////////////消息处理//////////////////////////////////////////////////////////////////////////VOID Msgg(){ MSG msg;            // 定义消息结构体对象
 BOOL fMessage;           // 定义布尔变量,……
 /*BOOL PeekMessage(          LPMSG lpMsg,  HWND hWnd,  UINT wMsgFilterMin,  UINT wMsgFilterMax,  UINT wRemoveMsg  );  lpMsg  指向MSG结构体  hWnd   窗口句柄  wMsgFilterMin 返回消息的最小值  wMsgFilterMax 返回消息的最大值  wRemoveMsg  选择消息是否保留 PM_****/ eekMessage(&msg,NULL,0,0,PM_NOREMOVE);     // 从消息队列中提取消息
 while (msg.message != WM_QUIT)  {  fMessage = PeekMessage(&msg,NULL,0,0,PM_REMOVE); // 从消息队列中提取消息  if (fMessage)   {   TranslateMessage(&msg);       // 分析消息   DispatchMessage(&msg);       //   }  else  {   // 调用 控制方法   Rend();          // 调用 渲染方法  } }}

[此贴子已经被Admin于2009-1-11 0:23:45编辑过]
发表于 2009-1-11 00:30:16 | 显示全部楼层
你把源代码拷贝到 写字板里面,然后再贴过来就好了!
 楼主| 发表于 2009-1-10 22:54:23 | 显示全部楼层
这个不会弄大家到时候看的时候把他放到VC里面看好了....里面很多代码都在1行
发表于 2009-1-11 00:14:03 | 显示全部楼层
怎么这么乱啊!!看不成~
发表于 2009-3-9 20:28:56 | 显示全部楼层
好东西,现在正学3D呢!来了个好论坛
发表于 2009-3-10 18:57:06 | 显示全部楼层
55555这也太乱了。。。怎么搞了,太不方便了。。。
发表于 2009-3-10 19:24:06 | 显示全部楼层
hWnd = CreateWindow(L"ClassName",   // 注册窗口类名字

      L"小试牛刀",   // 窗口的名称      

 

这些字符串前都加个L是什么意思?

 

  太迷糊了,  这源代码太无敌了

 楼主| 发表于 2009-3-11 09:33:28 | 显示全部楼层

L就是字符集....在项目->属性->常规->字符集里改

发表于 2009-3-11 11:27:00 | 显示全部楼层
使用 Unicode 字符集   前面需要加L  你是“使用多字节字符集”的代码 就不用了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 12:51

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表