DirectX9 SDK Samples(9) Text3D Sample

使用direct3d9技术绘制文字和生成顶点缓存 #include #include #include #include #include #include #include #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "winmm.lib ") #define WINDOW_CLAS 阅读详情

这次的例子是输出文字,包括UNICODE,2D和3D文字显示。

首先看看新增的全局变量:

ID3DXFont*                  g_pFont = NULL;
ID3DXFont*                  g_pFont2 = NULL;
ID3DXFont*                  g_pStatsFont = NULL;
ID3DXMesh*                  g_pMesh3DText = NULL;
WCHAR*                      g_strTextBuffer = NULL;

TCHAR g_strFont[LF_FACESIZE];
int                         g_nFontSize;
3种字体,一个网格,一个文字缓冲区,一个字体大小,还有一个文字字体数组。

沿袭上一次的习惯,每一个函数分别解析。

1

//--------------------------------------------------------------------------------------
// Initialize the app 
//--------------------------------------------------------------------------------------
void InitApp()
{
    wcscpy_s( g_strFont, 32, L"Arial" );
这是个字体的名称啦~

rsrc = FindResource( NULL, MAKEINTRESOURCE( IDR_TXT ), L"TEXT" );
    if( rsrc != NULL )
    {
        cbData = SizeofResource( NULL, rsrc );
        if( cbData > 0 )
        {
            hgData = LoadResource( NULL, rsrc );
            if( hgData != NULL )
            {
                pvData = LockResource( hgData );
                if( pvData != NULL )
                {
                    int nSize = cbData / sizeof( WCHAR ) + 1;
                    g_strTextBuffer = new WCHAR[nSize];
                    memcpy( g_strTextBuffer, ( WCHAR* )pvData, cbData );
                    g_strTextBuffer[nSize - 1] = 0;
                }
            }
        }
    }
这一段代码载入了一段UNICODE编码的文字资源,其实就是“Text3D.txt”文件。


2

HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                 void* pUserContext )
    HDC hDC = GetDC( NULL );
    int nLogPixelsY = GetDeviceCaps( hDC, LOGPIXELSY );
    ReleaseDC( NULL, hDC );

    int nHeight = -g_nFontSize * nLogPixelsY / 72;
    hr = D3DXCreateFont( pd3dDevice,            // D3D device
                         nHeight,               // Height
                         0,                     // Width
                         FW_BOLD,               // Weight
                         1,                     // MipLevels, 0 = autogen mipmaps
                         FALSE,                 // Italic
                         DEFAULT_CHARSET,       // CharSet
                         OUT_DEFAULT_PRECIS,    // OutputPrecision
                         DEFAULT_QUALITY,       // Quality
                         DEFAULT_PITCH | FF_DONTCARE, // PitchAndFamily
                         g_strFont,              // pFaceName
                         &g_pFont );              // ppFont
这一段代码创建了一个字体,注意,这里的字体高度值的算法是一个通用的算法,具体百度。

    if( FAILED( hr = D3DXCreateFont( pd3dDevice, -12, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
                                     OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                                     L"System", &g_pFont2 ) ) )
        return hr;

    if( FAILED( hr = D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
                                     OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                                     L"Arial", &g_pStatsFont ) ) )
        return hr;

    if( FAILED( hr = D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) ) )
        return hr;
再创建两个字体,然后创建了一个精灵,用来绘制字体。

3

HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
                                const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
提醒一下,这个函数在上面的函数执行完毕后执行,类型为D3DPOOL_DEFAULT的资源应该放在这里,具体就是不需要经常更新,可以一直放在显存的,静态的资源。

    SAFE_RELEASE( g_pMesh3DText );
    if( FAILED( CreateD3DXTextMesh( pd3dDevice, &g_pMesh3DText, g_strFont, g_nFontSize, FALSE, FALSE ) ) )
        return E_FAIL;
这里主要调用了一个函数来创建字体的3D网格,下面解释这个函数。

4
HRESULT CreateD3DXTextMesh( IDirect3DDevice9* pd3dDevice,
                            LPD3DXMESH* ppMesh,
                            TCHAR* pstrFont, DWORD dwSize,
                            BOOL bBold, BOOL bItalic )
    hFont = CreateFont( nHeight, 0, 0, 0, bBold ? FW_BOLD : FW_NORMAL, bItalic, FALSE, FALSE, DEFAULT_CHARSET,
                        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                        pstrFont );

    hFontOld = ( HFONT )SelectObject( hdc, hFont );
又创建了一个字体,注意,pstrFont中的是字体种类。然后将字体选进DC中,以后的内容均采用这种字体绘制。

    hr = D3DXCreateText( pd3dDevice, hdc, L"怎么了你累了",
                         0.001f, 0.4f, &pMeshNew, NULL, NULL );

    SelectObject( hdc, hFontOld );
    DeleteObject( hFont );
    DeleteDC( hdc );

    if( SUCCEEDED( hr ) )
        *ppMesh = pMeshNew;
调用API  D3DXCreateText来创建3D字体网格,注意这里先将网格放进指针pMeshNew,后面再将指针值赋值给ppMesh。


5

void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
基本上很多文字都放在这里渲染,这里就只放其中一段。

        if( g_pMesh3DText != NULL )
        {
            CDXUTPerfEventGenerator g( DXUT_PERFEVENTCOLOR, L"Demonstration Part 4" );
            ZeroMemory( &mtrl, sizeof( D3DMATERIAL9 ) );
            mtrl.Diffuse.r = mtrl.Ambient.r = 0.0f;
            mtrl.Diffuse.g = mtrl.Ambient.g = 0.0f;
            mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
            mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
            pd3dDevice->SetMaterial( &mtrl );
            pd3dDevice->SetTransform( D3DTS_WORLD, &g_matObj2 );
            g_pMesh3DText->DrawSubset( 0 );
        }
这一段就是绘制3D字体的代码,其实就是绘制网格。
AMD显卡在Windows上运行ComfyUI的DirectML稳定部署指南 DirectML是微软为Windows原生设计的跨厂商AI加速接口,专为AMD Radeon及Intel核显优化,无需CUDA或ROCm即可实现PyTorch与ONNX模型的GPU加速。其原理基于D3D12底层调度,通过DirectX 12 Ultimate驱动直接调用GPU计算单元,在Windows 10 20H1+及Win11 22H2系统中具备高兼容性与低侵入性。技术价值在于规避WSL2、OpenCL弃用、ROCm不支持等生态断层,显著提升Stable Diffusion XL等大模型的采样效率与稳定 阅读详情

相关推荐

Edge如何成为Gemini 3.1 Pro最佳浏览器载体?

WebGPU和SharedArrayBuffer是现代浏览器支撑大模型AI服务的两大底层技术基石。WebGPU通过GPU加速实现多模态推理性能跃升,SharedArrayBuffer则保障百万token长上下文的低延迟流式响应。二者共同构成AI原生浏览器的核心能力,决定AI Studio等云端模型服务的实际体验上限。在Windows 11与Edge 135环境下,其对WebGPU默认启用、SAB零拷贝映射等深度优化,使Gemini 3.1 Pro的图像分析提速33%、流式响应吞吐提升74%,远超Chrome

480

D3D画文字

#include #include #include #pragma comment(lib, "D3D9.lib") #pragma comment(lib, "D3dx9.lib") const TCHAR *kClassName = L"Rectangle_D3D"; IDirect3D9 *d3d9 = nullptr; IDirect3DDevice9 *device9 =

jujueduoluo的专栏 2412

DirectX学习笔记(十):3D字体的实现及用ID3DXFont接口绘制文本

1

lishuzhai的专栏 8413

D3D9 Samples(10)--Text3D

D3D9 Sample(10)—Text3D              打开Text3D项目。先编译运行下项目,看看效果:            这个例子演示各种字体的绘制,包括2D文字和3D立体文字。     1. 基本绘制   ID3DXFont*                  g_pStatsFont = NULL; 绘制上方黄色的两行字,显示:

TechTiger的博客 2237

【信息科学与工程学】计算机科学与自动化——第一百三十六篇 软件及工具05 OpenGL 01

类别厂商/型号支持情况x86_64 CPU​编号机制/用法表现形式和详细配置和底层设计编译器及底层实现·说明·缺陷·缺陷解决方案(含数学方程式描述与数学建模)引入版本国产化·信创·商用的CPU/GPU/ASIC/NP/DPU/其他硬件110多字段映射 (Multi-fields)​表现形式:一个字段同时以多种类型索引,如 text + keyword 组合。配置。支持链式多字段(fields.fields)。底层设计。

weixin_49199313的博客 22

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇01

编号类型领域问题问题的数学分析(含几何学/拓扑学/代数学/数论/集合论/离散数学/概率论/统计学/其他)及数值分析及算法分析及参数列表及参数数值设计C/C++/rust/python代码软件(含编译器)及硬件资源需求(CPU/GPU/内存【NAND/DRAM/HBM/其他】/HBM、HDD、SSD、RAID卡、其他)关联知识1工作负载调度数据中心最小化总完成时间/成本。

weixin_49199313的博客 214

透视挂原理:透明窗口,画框,画线,绘制文字的实现(C++)

先上效果图: 新建一个空项目,根据自己的D3D库路径导入D3D库(这里是用DrectX9,手贱画了三根线,不用理): 新建一个预编译.h头文件: #pragma once #include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3d9.lib") #pragma comment(lib,...

吾无法无天的博客 2万+

fps透视基础-d3d绘制-绘制文字-绘制方框-绘制连线

代码】fps透视基础-d3d绘制-绘制文字-绘制方框-绘制连线。

陈子青的博客 2348

D3D9学习笔记之字体

学习目标: 了解如何用 ID3DXFont 接口绘制文本 了解如何使用 CD3DFont 类绘制文本 了解如何计算应用程序每秒所绘制的帧数 了解如何用 D3DXCreateText 函数创建并绘制 3D 文本 ID3DXFont 接口 D3DX 库提供接口 ID3DXFont ,该接口用于在 Direct3D 应用程序中绘制文本。该接口内部使用 GDI(图像设备接口)来绘制文本,因此该接口在性...

weixin_44202285的博客 848

unity3D字体插件FlyingText3D最新版2.2.1

FlyingText3D插件官网同步最新版2.2.1,支持2018.3.0f

Shadow Map在DirectX9_0 SDK Sample 的实现方法

Shadow Map在DirectX9_0 SDK Sample 的实现方法

DirectX9 SDK Samples(13) Pick

本例子是关于用鼠标选取物体的。 1OnCreateDevice // Load the mesh with D3DX and get back a ID3DXMesh*. For this // sample we'll ignore the X file's embedded materials since we know // exactly the mod

1282

directx9 dxsample

directx9 dxsample

从VC++游戏源码剖析到现代引擎底层:图形API、游戏循环与状态机设计

游戏开发的核心在于理解其底层运行机制,这通常涉及图形API调用、游戏主循环和状态机设计等基础概念。图形API如DirectX/OpenGL负责将数据渲染到屏幕,是实时图形应用的基石。游戏主循环通过处理输入、更新逻辑和渲染帧,构成了游戏运行的心跳,其设计直接影响性能与稳定性。状态机则是实现游戏对象行为逻辑的经典模式,广泛应用于AI与角色控制。这些底层原理共同支撑了从2D精灵动画到复杂3D场景的渲染与交互,是理解现代游戏引擎封装逻辑的关键。通过剖析Visual C++时代的经典游戏源码,开发者可以直观学习到这些

weixin_34197488的博客 377

第一章 Cheat Enginee(CE)使用指南

Cheat Engine核心功能详细说明(以植物大战僵尸为例) 教你修改单机游戏。

m0_74545731的博客 1万+

【重磅更新】CT/MRI LI-RADS 2024:肝细胞癌局部区域治疗后反应评估的核心突破与临床实践指南

减少过度治疗:辐射 LRT 的 Nonprogressing 类别避免了 “持续强化 = 存活” 的误判,降低不必要的再治疗风险;提高检出效率:非辐射 LRT 的辅助特征升级减少了 Equivocal 比例,更早识别存活肿瘤;统一评估语言:标准化的分类标准为放射科、肝病科、肿瘤科、肝移植科的多学科协作(MDT)提供了统一 “沟通工具”,助力治疗方案的精准制定。

楚山之石的博客 1224

DouK-Downloader 上手指南:3 步把抖音视频批量存到本地

DouK-Downloader(仓库 TikTokDownloader)是一款完全开源、基于 HTTPX 的抖音 / TikTok 作品下载与数据采集工具:把链接或账号主页粘进去,视频、图集、音乐就按你定好的命名规则落到本地,作品字段还能同步导出成表格。它支持终端交互、后台监听、Web API 三种运行形态,采集数据可写入 CSV / XLSX / SQLite。 ## 先把一个链接里的视频存下

gitblog_01121的博客 239

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 356

用winget和PowerShell快速部署VS 2022+CUDA 13.1开发环境

Visual Studio 是 Windows 平台主流的 C++ 与 AI 开发集成环境,其与 CUDA 工具链的兼容性直接决定 GPU 加速项目的构建成功率。本文围绕 VS 2022(非虚构的‘VS 2026’)这一经微软长期验证的稳定版本,解析其与 CUDA 13.1 的官方兼容原理——关键在于安装路径规范性、注册表键值一致性及工作负载依赖可追溯性。传统图形化安装易引发静默参数失效、依赖解析黑盒、CUDA 集成断连等工程风险;而 winget 作为微软原生包管理器,结合 PowerShell 的自动化

weixin_33836874的博客 601

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 302

视觉巡线小车(STM32+OpenMV)——技术总结

在现代机器人技术中,视觉巡线是一种常见的导航方式,它允许机器人通过识别和跟踪地面上的线路来自主导航。本文将总结使用STM32微控制器和OpenMV视觉模块来实现视觉巡线小车的关键技术和步骤。

weixin_66608063的博客 3076

C/C++ 结合 Dear ImGui 与 Live2D 构建交互式虚拟形象

在桌面应用开发中,即时模式 GUI 与角色动画的融合正成为构建虚拟形象助手和交互原型的热门方向。Dear ImGui 以其轻量、高效的即时模式渲染机制,为开发者提供了灵活构建调试面板和控件的能力;而 Live2D 则通过骨骼参数驱动实现生动的 2D 角色动画。将两者集成于同一 C/C++ 进程,能够统一管理界面交互与角色渲染,实现视线追踪、眨眼以及触摸触发动作等真实互动体验。这种方案不仅适用于桌面宠物、直播辅助工具,也为教学演示和虚拟形象服务提供了可实现的技术路径。本文从工程实践角度,详细梳理了 Cubis

weixin_33861800的博客 289

[QMT和ptrade量化交易小白入门]-109、小市值选股的基础上用六脉神剑评分,回测年化可到132%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1859

D3D 文字 Text2D

研究D3D文字的例子程序。

架构师之路,举步维艰。 2485

STM32CubeMX | 38-使用硬件SPI驱动以太网模块(W5500)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与以W5500通信,驱动以太网模块。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): W5500以太网模块 这里我使用常见的以太网模块W5500: W5500官网 http://www.w5500.cn/ W5500中文手册 iEthernet W5500 Datasheet 软件准备 需要安装好Keil - MDK及芯片对应的包,以

Mculover666的博客(嵌入式) 7386

工业相机,大恒,面振相机8脚电源线和I/O触发接口线,颜色和接法说明和触发软件设定

上图: 说明一下,工业相机有TTL逻辑电平触发,也有光耦触发等。 这里一般我们用电路板驱动,就用GPIO触发模式, 这里,准备了两个GPIO触发模式,为LINE2,LINE3都可以选择,然后有一个GPIO_GND 如果,你只有一个触发接口,那么如图,选两个就好了。 实际接法如图。 ...

山云的专栏 1万+
上一篇: DirectX9 SDK Samples(8) BasicHLSL Sample(2)
下一篇: DirectX9 SDK Samples(10) HLSLwithoutEffects Sample
HowdChow
博客等级 码龄15年 10粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值