D3D文字 Text3D

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 window
	DXUTCreateWindow(
		L"dxut window",
		GetModuleHandle(NULL),
		NULL,
		NULL,
		CW_USEDEFAULT,
		CW_USEDEFAULT);

	//2.create device.
	DXUTCreateDevice(true,640,480);

	//3.main loop
	DXUTMainLoop();

	//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.呵呵,我终于把文字研究了一下 ,刚开始的时候连程序都看不懂,就是抄程序抄出来的,慢慢的也就理解了,可是距离研究游戏引擎还远呢。

时间: 2024-11-06 13:09:48

D3D文字 Text3D的相关文章

D3D 文字 Text2D

D3D文字是什么 由于文字在程序里面出现的次数太多,所以d3d就将他独立出来,成为单独的一个部分.游戏中使用的太多了,也就有了研究的必要.我在学习的时候问题的确很多,现在照样一知半解,不过知识总是慢点梳理的,有所得记录下来还是很不错的. D3D文字原理 我觉得D3D文字分为两类三种,第一类就是2D空间里面的文字,由于2D空间没有Z轴,所以文字的大小是很平均的,不会随着位置的改变大小发生变化.第二类就是3D空间里面的文字的,可以分为两种.第一种就是3D空间中的2D文字,比如说纹理图片里面的文字,显

鼠标响应文字跳动效果

前端开发whqet,csdn,王海庆,whqet,前端开发专家 昨天看到html5tricks上的一篇文章<jQuery鼠标滑过文字跳动动画插件>,止不住手痒用sass.css3实现一下,并进行了扩展,希望能对大家有所帮助. ---------- ------------------------------- 在线研究点击这里,下载收藏点击这里. ------------------------ ------ 首先来个广告,嘎嘎,前面两篇博文<纯CSS3文字效果推荐>.<CS

CSS立体文字效果最佳实践

上一篇的<纯CSS3文字效果推荐>文章里面推荐了8款纯css实现的文字效果,其中3d文字效果最为流行,限于篇幅仅仅展示了其3D实现原理,没有考虑代码的复用性和可移植性,今天来补充下,顺便领略sass的强大功能,请大家摩摩拳擦擦掌,开工咯! 案例效果还是在codepen,在线研究点这里,下载收藏点这里. 1.单单纯纯的效果一 为了简化操作,我们使用和上一篇文章<纯CSS3文字效果推荐>一样的文档结构,后面的效果大差小不差,也就不再列出. <div contenteditable

CSS3立体文字最佳实践

前端开发whqet,csdn,王海庆,whqet,前端开发专家 上一篇的<纯CSS3文字效果推荐>文章里面推荐了8款纯css实现的文字效果,当中3d文字效果最为流行,限于篇幅只展示了其3D实现原理,没有考虑代码的复用性和可移植性.今天来补充下.顺便领略sass的强大功能,请大家摩摩拳擦擦掌.开工咯! 案例效果还是在codepen,在线研究点这里,下载收藏点这里. 1.单单纯纯的效果一 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hxZXQ=/f

WhyDX9:翻写D3D红龙书中的程序

之前写过一套学习OpenGL的框架:WhyGL,即然有了GL那也应该再写个学习D3D的框架:WhyDX9.两个程序的架构相同,然后这个程序是将D3D红龙那本书的DEMO翻写了一遍.先将可执行程序发一下,代码等整理后再发. 使用说明: WhyDX9演示程序平台.exeWhyDX9.exe都可以运行程序,不同之处在于,一个是基本的Windows窗体程序,一个是MFC的单文档界面程序. 主UI界面上,鼠标点击可以选择要运行的DEMO键盘的上下键也可以选择DEMO,PageUp和PageDown用于翻页

WebGL如何解决中文文字载入

关于WebGL载入中文字体问题,我在网上搜了一下,发现例子并不多,而且只能实现隶书的载入,不支持其他中文字体. 下面是实现的代码: <script src="../js/three.min.js"></script> <!-- load the font file from canvas-text --> <script src="../Script/lisu_regular.typeface.js"></scr

Echarts-axislabel文字过长导致显示不全或重叠

先看两张图 按目前情况,官方并为对axislabel的高度或者宽度做调整.所以解决方案只能从其他方案下手 解决方案有几种 第一种为上图解决方案 设置grid属性定义图的大小来释放空间,使得axislabel有足够的空间 /** 参数传值全部为数组 * @param names x轴值 * @param xycounts * @param zscounts * @param xypjjlrs * @param zspjjlrs */ function drawZZTZXTBJ(names,xyco

SharePoint 2010/SharePoint 2013 Custom Action: 基于Site Collection 滚动文字的通知.

应用场景: 有时候我们的站点需要在每个页面实现滚动文字的通知,怎么在不修改Master Page的情况下实现这个功能?我们可以使用Javascript 和 Custom Action 来实现. 创建一个Custom Action.主要使用到 Location = 'ScriptLink' 属性, 该属性可以动态的加载JavaScript 文件链接和代码块到模板页.代码如下: <Elements xmlns="http://schemas.microsoft.com/sharepoint/&

Tesseract 3.02 OCR文字识别调查记录

安装使用: Tesseract下载地址 https://code.google.com/p/tesseract-ocr/ 目前最新版本为3.02 windows版下载解压后,使用命令行,进入解压后目录运行 命令格式: Usage:tesseract.exe imagename outputbase [-l lang] [-psm pagesegmode] e...] pagesegmode values are: 0 = Orientation and script detection (OSD