D3D文字 Text3D
来源:互联网 发布:高斯勒让德算法 编辑:程序博客网 时间:2024/06/06 00:37
Text3D是什么
Text3D就是一个网格模型,在3D空间中,文字对象对待方式就是一个模型,只不过代表的信息很不一般罢了。Text3D看起来有一定的立体感觉,因为有Z轴控制。这篇文章主要研究Text3D如何显示到3D场景中的。
Text3D显示原理
Text3D将文字看成一般的网格模型,设置属性的时候按照字体来设置,最后显示的时候按照3D空间中的网格模型来显示。
Text3D程序实现
说明
程序中有关Text3D的重要部分,我用中文注释了,如果想研究程序的框架,请参考DXUT。
程序源码
#pragma once//win32#pragma comment(lib,"comctl32.lib")#pragma comment(lib,"winmm.lib")//d3d#pragma comment(lib,"dxerr.lib")#pragma comment(lib,"d3dx9.lib")//dxut#pragma comment(lib,"dxut.lib")//dxut#include"DXUT.h"HRESULT CALLBACK OnDeviceCreate( IDirect3DDevice9* pd3dDevice,const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );void CALLBACK OnDeviceDestroyed(void* pUserContext );void CALLBACK OnFrameRender(IDirect3DDevice9* pd3dDevice,double fTime,float fElapsedTime, void* pUserContext );void SetUpMatrix(IDirect3DDevice9* pd3dDevice);void SetupLight(IDirect3DDevice9* pd3dDevice);//TODO: global variables.//声明文字模型ID3DXMesh* g_pd3dxTextMesh=NULL;INT WINAPI wWinMain(HINSTANCE,HINSTANCE,LPWSTR,INT){DXUTSetCallbackD3D9DeviceCreated(OnDeviceCreate,NULL);DXUTSetCallbackD3D9DeviceDestroyed(OnDeviceDestroyed,NULL);DXUTSetCallbackD3D9FrameRender(OnFrameRender,NULL);//0.dxut init.DXUTInit(true,true,NULL,true);//1.create windowDXUTCreateWindow(L"dxut window",GetModuleHandle(NULL),NULL,NULL,CW_USEDEFAULT,CW_USEDEFAULT);//2.create device.DXUTCreateDevice(true,640,480);//3.main loopDXUTMainLoop();//exit.return DXUTGetExitCode();}HRESULT CALLBACK OnDeviceCreate( IDirect3DDevice9* pd3dDevice,const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ){//TODO: create d3d device.//创建文字模型。HDC hdc=CreateCompatibleDC(NULL);HFONT hNewFont=NULL;HFONT hOldFont=NULL;hNewFont=CreateFont(24,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,L"Arial");hOldFont=(HFONT)SelectObject(hdc,hNewFont);if(FAILED(D3DXCreateText(pd3dDevice,hdc,L"你好,世界!",0.001f,0.4f,&g_pd3dxTextMesh,NULL,NULL))){return E_FAIL;}SelectObject(hdc,hOldFont);DeleteObject(hNewFont);DeleteDC(hdc);return S_OK;}void CALLBACK OnDeviceDestroyed(void* pUserContext ){//TODO:destroy d3d device.//释放文字模型if(g_pd3dxTextMesh != NULL){g_pd3dxTextMesh->Release();g_pd3dxTextMesh=NULL;}}void CALLBACK OnFrameRender(IDirect3DDevice9* pd3dDevice,double fTime,float fElapsedTime, void* pUserContext ){pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);//设置矩阵变换SetUpMatrix(pd3dDevice);SetupLight(pd3dDevice);if(SUCCEEDED(pd3dDevice->BeginScene())){//TODO:render d3d scene.//绘制文字模型g_pd3dxTextMesh->DrawSubset(0);pd3dDevice->EndScene();}pd3dDevice->Present(NULL,NULL,NULL,NULL);}void SetUpMatrix(IDirect3DDevice9* pd3dDevice){D3DXMATRIXA16 worldMatrix;D3DXMatrixIdentity(&worldMatrix);D3DXMatrixTranslation(&worldMatrix,-2.0f,0.0f,0.0f);pd3dDevice->SetTransform(D3DTS_WORLD,&worldMatrix);D3DXMATRIXA16 viewMatrix;D3DXVECTOR3 vEye(0.0f,0.0f,-10.0f);D3DXVECTOR3 vLookAt(0.0f,0.0f,0.0f);D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);D3DXMatrixLookAtLH(&viewMatrix,&vEye,&vLookAt,&vUp);pd3dDevice->SetTransform(D3DTS_VIEW,&viewMatrix);D3DXMATRIXA16 projectionMatrix;D3DXMatrixPerspectiveFovLH(&projectionMatrix,D3DX_PI/4,1.0f,1.0f,1000.0f);pd3dDevice->SetTransform(D3DTS_PROJECTION,&projectionMatrix);}void SetupLight(IDirect3DDevice9* pd3dDevice){D3DMATERIAL9 mtrl;ZeroMemory(&mtrl,sizeof(mtrl));mtrl.Ambient.r=mtrl.Diffuse.r=1.0f;mtrl.Ambient.g=mtrl.Diffuse.g=1.0f;mtrl.Ambient.b=mtrl.Diffuse.b=0.0f;mtrl.Ambient.a=mtrl.Diffuse.a=1.0f;pd3dDevice->SetMaterial(&mtrl);D3DLIGHT9 light;D3DXVECTOR3 dir(1.0f,0.0f,0.0f);D3DXCOLOR color(1.0f,1.0f,1.0f,0.0f);ZeroMemory(&light,sizeof(light));light.Type=D3DLIGHT_DIRECTIONAL;light.Ambient=color*0.6f;light.Diffuse=color;light.Specular=color*0.6f;light.Direction=dir;pd3dDevice->SetLight(0,&light);pd3dDevice->LightEnable(0,TRUE);pd3dDevice->SetRenderState(D3DRS_LIGHTING,TRUE);pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);}
Text3D程序结果
Text3D总结
1.程序的逻辑不是很难,声明3D文字模型,创建文字模型,渲染显示文字模型,释放文字模型。
2.需要注意的地方是 创建文字模型 需要有字体属性,这里的字体是windowsGUI里面的字体。创建字体需要获得设备句柄。在渲染的时候需要设置坐标转换,字体的位置按照第一个字的左下角定位。
3.需要注意的函数
创建字体:CreateFont()
创建文字模型:D3DXCreateText()
平移矩阵函数:D3DXMatrixTranslation()
4.呵呵,我终于把文字研究了一下 ,刚开始的时候连程序都看不懂,就是抄程序抄出来的,慢慢的也就理解了,可是距离研究游戏引擎还远呢。
1 0
- D3D文字 Text3D
- D3D文字渲染心得
- D3D显示文字
- D3D 文字 Text2D
- D3D画文字
- D3D9 Samples(10)--Text3D
- D3D
- D3D
- d3d
- D3D
- DirectX9 SDK Samples(9) Text3D Sample
- D3D入门-D3D介绍
- D3D资源管理
- D3D 札记
- 实用D3D
- d3d beginning
- d3d资源管理
- D3D 文本
- jshint检查js文件
- 【杂题】 HDOJ 4342 History repeat itself
- 查找第K大的元素
- Java判断一个字符串是不是数字
- C语言经典例题及答案13
- D3D文字 Text3D
- 程序员面试什么最重要?
- 内回路的表达
- astyle
- C#,GDI+开发综合录井图
- unity中shader的Cutout问题
- 游戏状态机
- windows metro app c#工程调用c++写的静态库
- 废代码的危害和解决之道