D3D来实现2D的效果 的方法

DirectX3d 9 实现3d lut滤镜效果 一、背景 已经在OpenGL中实现了3Dlut滤镜,下面需要在DirectX中做实现 二、方法一 在d3d上下文中创建d2d对象,再用d2d的内建效果实现lut滤镜。 原理 https://docs.microsoft.com/en-us/windows/win32/direct2d/3d-lookup-table-effect 实现demo https://download.youkuaiyun.com/download/dustpg/7830947 备注:这种方法用d2d可实现lut滤镜,但是d3d9不支持创建共享 阅读详情

很多D3D的初学者最感到困惑的问题是如何用D3D来实现2D的效果,因为DirectDraw已经不存在了(当然你还是可以用以前的版本的,但是可能不法利用一些最近的硬件加速)在这里我给大家介绍几种方法可以实现用D3D编写2D游戏

 

方法一:
使用D3DX的接口ID3DXSprite,

void DrawSprite_2D( 
        int dx,//窗口中的X座标
        int dy,//窗口中的Y座标
        int sx,//tex纹理中的X座标
        int sy,//tex纹理中的Y座标
        int sw,//tex纹理中的子区域宽度
        int sh,//tex纹理中的子区域高度
        IDirect3DDevice9* device,
        ID3DXSprite* sprite,
        IDirect3DTexture9* tex,//已生成的纹理
        bool trans )
{
D3DXCOLOR c = D3DCOLOR_XRGB(255,255,255);
D3DXMATRIX identity;
D3DXMatrixIdentity( &identity );

RECT r;
r.left = sx;
r.top = sy;
r.right = sx+sw;
r.bottom = sy+sh;

device->SetTransform( D3DTS_WORLD,&identity );
device->SetTransform( D3DTS_VIEW,&identity );

if( trans )
{
sprite->Begin( D3DXSPRITE_ALPHABLEND );
}
else
{
sprite->Begin( 0 );
}

          //把纹理中的子区域画在指定的屏幕坐标上
sprite->Draw( tex,&r,0,&D3DXVECTOR3(dx,dy,0),c );
sprite->End();
}

是不是很简单呢?但是要有一些要注意的地方,因为D3D对纹理的大小有一些限制,必须是2的N次幂,因此,如果你想通过一个任意大小的图片来生成纹理,那么在生成的过程中D3D会自动把它变成2的N次幂的纹理,在些过程中会产生一些拉申或收宿的效果,这样就很难显示一些图片的原始效果,这里的解决办法是,在用PHOTOSHOP等软件画图时,最好是把图片的长与宽都指定成256X256等型式,这样在用ID3DXSprite接口画图片时就不会产生走样了

方法二:
使用平行投影相机OrthoCamera

这里的程序示例以在窗口中画一个四边型为例,画图片是相同的道理

struct VERTEX_T
{
VERTEX_T()
{
v = D3DXVECTOR3( 0,0,0 );
c = D3DCOLOR_ARGB( 0,0,0,0 );
}
VERTEX_T( float x,float y,float z )
{
v = D3DXVECTOR3(  x,y,z );
c = D3DCOLOR_ARGB( 125,0,0,0 );
}

VERTEX_T( float x,float y,float z,D3DCOLOR dif )
{
v = D3DXVECTOR3(  x,y,z );
c = dif;
}

D3DXVECTOR3 v;
D3DCOLOR c;

static const DWORD FVF;
};

const DWORD VERTEX_T::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

void DrawRect_2D( 
int x,
int y,
int w,
int h,
D3DXCOLOR c0,
D3DXCOLOR c1,
D3DXCOLOR c2,
D3DXCOLOR c3,
IDirect3DDevice9* device,
bool trans,
float alpha )
{
VERTEX_T v[4];
D3DXMATRIX proj,identity;

D3DXMatrixIdentity( &identity );
D3DXMatrixOrthoOffCenterLH(&proj,0.0f,(float)Width,-(float)
         Height,0.0f,-100.0f,100.0f);

device->SetTransform(D3DTS_WORLD,&identity);
device->SetTransform(D3DTS_VIEW,&identity);
device->SetTransform(D3DTS_PROJECTION,&proj);
device->SetRenderState(D3DRS_ZENABLE,false);

if( trans )
{
device->SetRenderState( D3DRS_ALPHABLENDENABLE,true );
device->SetRenderState( D3DRS_SRCBLEND,D3DBLEND_SRCALPHA );
device->SetRenderState( D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA );
c0.a = alpha;
c1.a = alpha;
c2.a = alpha;
c3.a = alpha;
}

v[0] = VERTEX_T( x,-y,0,c0 );
v[1] = VERTEX_T( x + w,-y,0,c1 );
v[2] = VERTEX_T( x,-( y + h ),0,c2 );
v[3] = VERTEX_T( x + w,-( y + h ),0,c3 );

device->SetFVF( VERTEX_T::FVF );
device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP,2,v,sizeof( VERTEX_T ) );

device->SetRenderState( D3DRS_ZENABLE,true );
device->SetRenderState( D3DRS_ALPHABLENDENABLE,false );
}

由于代码很少,在此就不作详细说明了代码中的Width和Height变量是窗口的客户区宽与高

方法三:
可以使用顶点的RHW,在顶点的格式中或上D3DFVF_XYZRHW
RHW它是指该顶点包含已经进行光照、坐标转换后的数据,而该数据就是屏幕座标,因些可以直接在顶点的数据结构中写上屏幕座标即可。我很少用这种方法,只是用它作过实验,因些代码暂不列出

方法四:
就是在3D空间中与相机方向垂直的指定平面上画图,因些就要有两个函数一个是获取相机的原点到屏幕上一点的射线,另一个就是射线与平面的交点,
有了这个交点就可以在3D空间中画四边型了,从而显示出2D图像,
而关键是第一个函数,射线与平面的交点可用数学知识直接求出

下面的函数为计算出鼠标点击窗口的客户区后所产生的相机原点与该点相连的射线

RAY_T CPerspectiveCamera::GetRay( int x,int y )
{
int w = m_W;//D3D绘图区的宽
int h = m_H;//D3D绘图区的高

D3DXMATRIX matProj;
matProj = GetProjMatrix();//得到投影矩阵

POINT ptCursor;
ptCursor.x = x;
ptCursor.y = y;

D3DXVECTOR3 v;
v.x =  ( ( ( 2.0f * ptCursor.x ) / w  ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / h ) - 1 ) / matProj._22;
v.z =  1.0f;

D3DXMATRIX matView,m;
matView = GetViewMatrix();
D3DXMatrixInverse( &m,NULL,&matView );

RAY_T _ray;

_ray.dir.x  = v.x*m._11 + v.y*m._21 + v.z*m._31;
_ray.dir.y  = v.x*m._12 + v.y*m._22 + v.z*m._32;
_ray.dir.z  = v.x*m._13 + v.y*m._23 + v.z*m._33;
_ray.org.x = m._41;
_ray.org.y = m._42;
_ray.org.z = m._43;

return _ray;
}

由于这个函数是我编写的程序中的一部分,因此有一些函数在这里没有给出原程序,但不影响对这个程序的阅读,请朋友们见谅

以上是我所知道的在D3D中画2D图形的方法,如果大家还有好的方法,请指教
如果以上有错误,请指正,以免给大家造成误导
谢谢

MCU车载3D显示实战:从2.5D原理到仪表盘应用 在嵌入式图形显示领域,MCU(微控制器)长期被视为只能处理简单2D界面,但新一代跨界MCU已集成图形加速器和显示控制器,让车载仪表盘也能流畅呈现3D感画面。其核心并非传统实时三维渲染,而是通过透视变换、图层分层、缩放旋转等2.5D技术,在视觉上模拟立体效果,兼顾性能与成本。这类方案原理简单、计算可控,配合DMA2D硬件加速和帧缓冲切换,能显著降低CPU负载,非常适合对启动速度和功能安全有严格要求的车载仪表盘及中控显示场景。本文从硬件选型、渲染链路、像素填充率预算,到具体代码实现和调试排障,全面解析了MCU驱 阅读详情

相关推荐

maxpool3d修改成maxpool2d与maxpool1d

maxpool3d修改成maxpool2d与maxpool1d

jacke121的专栏 826

Windows游戏编程系列之6:D3D编程基础及游戏开发实战

我将带领大家认真学习D3D的系列编程,从窗口开始,到GDI、到D3D、到三维场景、纹理映射、光照与材质、顶点与索引、Alpha混合、深度测试等。大家在学习中要多总结分析、遇到不会的问题要多问、多交流。具体的内容包括:D3D开发环境的搭建与配置、Windows窗口与消息、D3D编程基础、D3D的顶点缓存与索引缓存、 D3D三维世界之四大变换、D3D三维世界之光照与材质、D3D编程之纹理映射、D3D编程之Alpha混合技术、D3D编程之深度测试与Z缓存、D3D编程之三维粒子系统以及DirectInput鼠标与键盘等。

D3D11_RenderTo2DTexture

D3D11_RenderTo2DTexture

在DirectX 8 中进行2D渲染

【简介】  最近,我看到很多关于DirectX8在最新的API中摒弃DirectDraw的问题。很多人回到了以前的DX7.1中。我可以理解那些在DX7.1中有很多开发经验的人为什么这样做,但是有很多问题却是来自于那些刚学DX,还没有学过以前的API的初学者。  【正文】  Background背景  最近,我看到很多关于DirectX8在最新的API中摒弃DirectDraw的问题

zzz822163的专栏 943

D3D渲染2D精灵的几种方法及性能比较

\D3D渲染2D精灵的几种方法及性能比较

脑机接口最新发展动态报告 (2024-2025)

脑机接口动态

高山 4106

D3D加载纹理的步骤之点精灵加载2D图片(2)

由于在(1)中写的代码文字比较长,所以分了两篇文章写。

喜欢吃一口烤肉的啵啵 2364

YOLOv5改进系列(4)——添加ECA注意力机制

手把手教你在YOLOv5中加入ECA注意力机制,文内含两种方法,小白也能看懂!

路人贾的博客 8547

Windows7的图形架构与DX的那点事

<br />原文链接 : 2D Drawing APIs in Windows<br />    在 Windows 7 操作系统中,微软花费了很大的力气构建了一套新的 2D 绘图 API。我们称之为 Direct2D ,隶属于 DirectX 家族。这个 API 的开发填补了 Windows 图形平台的一些缺陷。其中非常重要的一点就是普通的 2D 程序渲染不再缺乏硬件加速。而在 Windows Vista 中,我们知道 GDI 是无法进行硬件加速的。微软寄望于开发的这个 API 具备很多现代特性。比如支持

痞子龙3D编程 2852

按角色定制同一张 Fiori 画面:一篇讲透 SAP Fiori UI Adaptation for Roles 的版本、优先级、视图迁移与安全边界

摘要:SAP Fiori应用中常见的问题并非功能缺失,而是同一应用被不同岗位用于不同工作流时导致界面难以满足各方需求。SAP的"角色适配UI"机制允许在不修改后端逻辑或创建新应用的情况下,为不同角色定制界面呈现。该机制包含多套界面适配方案,按用户角色自动匹配显示,同时保持统一的应用入口。实施时需注意:适配方案与原始应用共享版本管理;需设置"默认界面层";多角色用户通过优先级机制确定显示方案;界面隐藏不等于权限控制,数据安全仍需后端保障。该方案能有效解决跨岗位的界面适配

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 149

SAP Event Mesh 简介

Get Started with Messaging for Decoupled Communication Step 1: What is the SAP Event Mesh service? SAP Event Mesh 是一种完全托管的服务,用于连接应用程序、服务和系统,以便它们可以通过消息和事件相互交互。 它通过引入中央消息代理取代了传统的点对点通信。 虽然点对点通信适用于在有限数量的发送方和接收方之间共享数据,但可扩展性很快就会成为一个问题。 SAP Event Mesh 解决了这个问题,并确保

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1243

Unity学习--3D动画--动画混合(1D与2D)

本文介绍了Unity动画系统中的动画混合功能,主要内容包括: 动画混合的作用是组合多个动画片段,实现更流畅自然的过渡效果 1D和2D混合的实现方式:通过混合树创建,设置参数阈值,添加动画片段 1D混合调整单参数控制,2D混合提供四种模式应对不同场景需求 实际应用步骤:参数设置、动画片段添加、阈值调整和效果预览 总结指出混合树可嵌套使用实现复杂效果,代码中只需控制对应参数即可

misco43的博客 1176

学Simulink——基于高渗透率可再生能源微电网的逆变器系统场景实例:含高比例逆变型电源的微电网暂态稳定性分析

本文详细介绍了基于MATLAB/Simulink的高渗透率可再生能源微电网建模方法,重点分析含高比例逆变型电源的微电网暂态稳定性问题。通过构建包含光伏、风电、逆变器和电网等模块的系统模型,展示了从项目创建、模块搭建到控制策略实现的完整过程。文章特别提供了逆变器PQ控制算法和故障处理逻辑的代码示例,并介绍了仿真参数设置与结果分析方法。该模型能有效评估微电网在故障条件下的动态响应特性,为优化逆变器控制策略提供依据,对现代智能电网研究具有重要意义。

xiaoheshang_123的博客 140

Java中2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码

2.5D游戏,虽然在外观上近似于3D游戏,却又不是严格意义上讲的3D游戏,故此2.5D游戏又常被称为[伪3D游戏]。在笔者的观念中,2.5D严格上说并不能算是一种技术,而只是一种实现方式或者说应用手段。大多数时候,游戏公司之所以会采取2.5D方式开发游戏,常是为解决3D及2D技术混用而采取的一种折中,而并不是说这种手段有多么先进。2.5D游戏的实现方式虽然很多,但主要无非有三类,即:2D角色+3D...

mmdev 257

web渗透学习手册

依据多年的渗透测试项目经验及个人理解,对漏洞分类

渗透之路,攻防之间皆学问 1万+

【2022】人工智能☆✨

1. 朴素⻉叶斯⽅法是⼀种 ( ) ⽅法。A.机器学习的分类B.不确定性推理C.知识表示答案:A解析:朴素贝叶斯分类器是基于贝叶斯定理与特征条件独立假设的分类方法。它通过学习训练数据集来预测未知数据的类别标签,因此属于机器学习中的监督学习分类方法。选项B不确定性推理和选项C知识表示虽然与朴素贝叶斯方法有一定的关联,但它们并不是朴素贝叶斯方法的主要应用领域或定义特性。2. 关于启发式搜索描述正确的是 ( )。

super_mochi1 402

Unity的2.5D效果探究

2.5D可能并不是一个很精准的词,我这里所指的是DNF这种可以在3个轴向上运动的2D精灵类型的效果。 以DNF为例,精灵实际上没有Z轴坐标的,当按↑,人物向屏幕里(远离玩家)方向移动时(z轴),在渲染上,我们看到人物是在向上移动。而我们按c,人物跳起(y轴),我们仍然看到人物在向上移动。这就是DNF类游戏看起来有点3d效果的奥秘:它营造一种我们在斜向下45度(或者其它角度)观看地面的感觉,因此当...

啊循的专栏 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

游戏开发中实现3渲2效果的常见方法

正交投影适合简单的2D游戏,提供一种没有透视的纯粹视图。预渲染适合在资源允许的情况下使用,可以获得高质量的静态图像或动画。法线贴图与光照效果适合需要细节增强的2D游戏,能够通过细节表现3D效果。2.5D视角适合需要一定三维视觉效果的2D游戏,像等距视角或广告牌渲染。渲染到平面适合需要动态背景或粒子效果的场景,可以实时渲染3D效果并映射到2D界面中。这些技术可以单独使用,也可以组合在一起,具体选择取决于游戏的类型、目标平台以及性能需求。

m0_46503667的博客 2102

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

聊一聊DX字体

<br /><br />作者:StrongCoding<br /> <br />邮箱:StrongCoding@qq.comDX群:130302441<br /> <br />若文中有误,请告知.十分感谢.一起加油.<br /> <br />在游戏开发中,我们经常需要显示的在屏幕上打印字体,已将文字消息渲染到屏幕,实现信息互动。本篇就是基于此,好了,不多说了,开始吧:<br /> <br />DX一共支持三种字体的渲染,在这里说一下:伪代码掩饰哈<br /> <br /><1>最简单的ID3DXFONT,其

StrongCoding的专栏 1213

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MATLAB 中 2D/3D 局部边坡估计与结构滤波方法探索

MATLAB环境下2D/3D局部边坡估计和结构滤波方法算法运行环境为matlab r2018a,执行一种2D/3D局部边坡估计和结构滤波方法。压缩包=数据+程序+参考在 MATLAB 的世界里,我们常常会接触到各种数据处理和分析的方法,今天就来聊聊在 MATLAB R2018a 环境下执行的 2D/3D 局部边坡估计和结构滤波方法。

CqgXiPSNYno的博客 660
上一篇: DrawPrimitiveUP 与 DrawPrimitive
下一篇: iPhone游戏中既播放背景音乐又播放特效声音的办
dadalan
博客等级 码龄20年 428粉丝 770原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值