Direct3D中的绘制

Direct3D地形绘制基础 思路是:地形中海拔较低的部分上色为沙滩色,中等海拔的部分上色为绿色的丘陵颜色,高海拔的部分上色为雪山的颜色。RAW文件本质上是一个连续的字节存储块,其中将字节型向量复制到一个整型向量中,我们就可对高度值进行比例变换从而突破0~255的限制,该方法的唯一限制是。我们对该类的构造函数还传入了与地形相关的设备指针、一个标识了存储高度图数据的文件的字符串,以及一个用于对高度图中各元素实施比例变换的。,所以,如果您要从一个256×256的RAW文件中读取数据,相应地您只能创建一个至多有256×256个顶点的地形。 阅读详情

 Direct3D中的绘制

 

一.顶点缓存与索引缓存
  一个顶点缓存是一个包含顶点数据的连续内存空间.
  一个索引缓存是一个包含索引数据的连续内在空间.

  我们之所以用顶点缓存和索引缓存而非数组来存储数据,是因为顶点缓存和索引缓存可以被放置在显存video memory中,显存在绘制时比内存中的数据快


顶点缓存用接口:
  IDirect3DVertexBuffer9

索引缓存用接口
  IDirect3DIndexBuffer9

 

1.创建顶点缓存和索引缓存

//创建顶点缓存
HRESULT CreateVertexBuffer(
  UINT Length,   //缓存的长度 顶点个数*FVF的结构体大小
  DWORD Usage,   //指定关于如何使用缓存的一些附加属性
  DWORD FVF,   //灵活顶点格式
  D3DPOOL Pool,   //容纳缓存的内存池
  IDirect3DVertexBuffer9** ppVertexBuffer,//所要创建的顶点缓存的指针
  HANDLE* pSharedHandle //0
);

//创建索引缓存
HRESULT CreateIndexBuffer(
  UINT Length,
  DWORD Usage,
  D3DFORMAT Format,  //指定索引的大小,设为D3DFMT_INDEX16表示16位索引
  D3DPOOL Pool,
  IDirect3DIndexBuffer9** ppIndexBuffer,//所要创建的索引缓存的指针
  HANDLE* pSharedHandle //0
);

 

 创建缓存时,如果未使用标记D3DUSAGE_DYNAMIC,则称所创建的缓存为静态缓存static buffer.静态缓存一般被放置在显存中,以保证存储于其中的数据得到最高效的处理.然而,静态缓存是以牺牲对静态缓存读写操作的速度为代价,这是因为访问显存的速度本身就很慢

 动态缓存dynamic buffer一般放置在AGP(accelerated Graphics Ports)存储区中,其内容可以被迅速更新,动态缓存中数据的处理速度不像静态缓存那样快,就是因为在绘制前数据必须传输到显存中


注意:
 对显示和AGP存储区进行读操作非常慢.所以如果您需要在程序运行时读取几何数据,最好在系统内在中保留一份副本,然后在需要时对其进行读报操作.

 

 

2.访问缓存内容:
   我们需要获得指向缓存内部存储区域的指针,可以借助方法lock来获取指向缓存内容的指针.很重要的一点是,对缓存访问完毕后,必须对缓存进行解锁.
注意:
 如果创建顶点缓存或索引缓存时,使用了D3DUSAGE_WRITEONLY标记,您便无法对该缓存进行读操作,否则会导致读取失败.
//
HRESULT IDirect3DVertexBuffer9::Lock(
  UINT OffsetToLock,  //自缓存的起始点到开始锁定的位置的偏移量
  UINT SizeToLock,  //要锁定的字节数 
  VOID ** ppbData,  //指向被锁定的存储区起始位置的指针
  DWORD Flags   //指定锁定的方式,可以是0
);

HRESULT IDirect3DVertexBuffer9::Lock(
  UINT OffsetToLock,
  UINT SizeToLock,
  VOID ** ppbData,
  DWORD Flags
);

 

3.获取顶点缓存和索引缓存的信息
typedef struct D3DVERTEXBUFFER_DESC {
    D3DFORMAT Format;  //index的格式
    D3DRESOURCETYPE Type; 
    DWORD Usage;  
    D3DPOOL Pool;
    UINT Size;
    DWORD FVF;
} D3DVERTEXBUFFER_DESC, *LPD3DVERTEXBUFFER_DESC
;

 

得到CreateVertexBuff和CreateIndexBuff的一些信息
D3DVERTEXBUFFER_DESC vbDescription;
vertexBuffer->GetDesc(&vbDescription);

typedef struct D3DINDEXBUFFER_DESC {
    D3DFORMAT Format;
    D3DRESOURCETYPE Type;
    DWORD Usage;
    D3DPOOL Pool;
    UINT Size;
} D3DINDEXBUFFER_DESC, *LPD3DINDEXBUFFER_DESC;

D3DINDEXBUFFER_DESC ibDescription;
indexBuffer->GetDesc(&ibDescription);

 

二.绘制状态
Direct3D封装了多种绘制状态(rendering state), 这些绘制状态将影响几何体的绘制方式.
用来改变原来默认的绘制状态:
HRESULT SetRenderState(
  D3DRENDERSTATETYPE State, //绘制的状态
  DWORD Value  //改变的值
);

 

三.绘制的准备工作
步骤:
1.指定数据流输入源:将顶点缓存和数据流进行链接,实质上是将几何体的信息传输到绘制流水线中.
HRESULT SetStreamSource(
  UINT StreamNumber,   //标识与顶点缓存建立链接的数据流 ,0
  IDirect3DVertexBuffer9 * pStreamData, //指向我们希望与给定数据流建立的链接的顶点缓存指针
  UINT OffsetInBytes,   //顶点的起始位置
  UINT Stride    //将链接到数据流的顶点缓存中每个元素的大小
);


2.设置顶点格式,在这里指定后续绘制调用中使用的顶点格式
HRESULT SetFVF(
  DWORD FVF
);

之前顶点使用的灵活顶点格式


3.设置索引缓存.
HRESULT SetIndices(
  IDirect3DIndexBuffer9 * pIndexData
);

 

四.使用顶点缓存和索引缓存进行绘制
目的:使用DrawPrimitive或DrawIndexedPrimitive方法将待绘几何体的信息通过绘制流水线传输.

1.IDriect3DDevice9::DrawPrimitive
HRESULT DrawPrimitive(
  D3DPRIMITIVETYPE PrimitiveType,//所要绘制的图元类型
  UINT StartVertex,   //顶点数据流中标识顶点数据读取起点的元素索引
  UINT PrimitiveCount  //所要绘制的图元数量
);

 

2.IDirect3DDevice9::DrawIndexedPrimitive
HRESULT DrawIndexedPrimitive(
  D3DPRIMITIVETYPE Type, //所要绘制的图元类型
  INT BaseVertexIndex,  //为索引增加一个基数
  UINT MinIndex,   //允许引用的最小索引值
  UINT NumVertices,  //本次调用中将引用的顶点总数
  UINT StartIndex,  //顶点缓存中标识索引的读取起始点的元素的索引
  UINT PrimitiveCount  //所要绘制的图元数量
);

 

3.Beign/End Scene
所有的绘制方法都必须在IDriect3DDevice9::BeginScene和IDriect3DDevice9::EndScene构成的方法对之间进行调用.

 

五.D3DX几何体
D3DXCreateBox
D3DXCreateSphere
D3DXCreateCylinder
D3DXCreateTeapot
D3DXCreatePolygon
D3DXCreateTorus

 

他们都使用D3DX网格结构ID3DXMesh和ID3DXBuffer

ID3DXMesh * mesh = 0;
D3DXCreateTeapot(_device, & mesh, 0);

_device->BeginScene();
 _mesh->DrawSubset(0);
_device->EndScene();

_mesh->Release();
_mesh = 0;


六.例程
见:

 http://download.youkuaiyun.com/source/1831506

Direct3D 11教程2:绘制一个三角形 概览 在前面的教程中,我们创建了一个最小化的Direct3D 11程序在平面上输出了单一的颜色。 本教程中,我们会在屏幕上绘制一个三角形。我们会学习设置三角形数据结构的方法。 源代码 (SDK root)\Samples\C++\Direct3D10\Tutorials\Tutorial02 三角形的构成 三角形由三个点定义,这些点又叫顶点(vertex)。确定位置的三个顶点定 阅读详情

相关推荐

掌握Direct3D精灵绘制技术

本文深入探讨了使用Direct3D进行2D精灵绘制的核心技术。首先,我们定义了什么是精灵,并区分了动态精灵和静态精灵的概念。随后,文章详细介绍了在Direct3D中处理透明精灵的挑战,以及使用D3DXSprite类和Direct3DTexture8对象进行高效渲染的方法。本文还提供了Direct3D精灵处理的实用结构和示例代码,帮助读者更好地理解和运用精灵绘制技术。

weixin_42466723的博客 494

Direct3D 11 总结 —— 5 绘制矩形

介绍 本文,将在上文的基础上,绘制矩形区域。一般 direct3D 通过绘制三角形,拼成其他图像,对于矩形,本文将绘制两个三角形,以拼成一个矩形。 代码 主要修改点 输入装配阶段 一个是输入的坐标点数,之前是3个点,本文输入的 4个点。 绘制2个三角形,有两种方式,一种是输入6个点,其中有2对点是一样的。 另外一种方式是输入4个点,在加上6个索引点。 绘制命令 针对两种输入方式,有两个对应的绘制命令。 m_pContext->Draw(6, 0); 通过输入顶点绘制6个点绘制图形 m_pContex

dss875914213的博客 1833

Direct3D基础:从顶点声明到绘制立方体

本文深入探讨了Direct3D基础编程的两个关键概念:顶点声明的设置和立方体的绘制。通过顶点声明,开发者可以定义和注册顶点数据格式以供Direct3D解释。在立方体绘制的示例中,我们看到了如何定义顶点结构、创建几何图形、构建坐标变换矩阵以及如何设置渲染状态。此外,还详细讲解了立方体类的数据成员、构造函数、析构函数、设备丢失和重置时的处理方法,以及如何处理用户输入以更新场景。

weixin_35761094的博客 393

Directx11教程(19) 画一个简单的地形

      通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦、余弦函数的组合等等,可以得到一个看似不错的地形或者水面的效果。 在本教程中我们修改ModelClass.h和ModelClass.cpp,得到一个近似的地形。         在本章代码中,我们定义300*300=90000个顶点,共(300-1)(300-1)*2个三角形,每个网格的大小都为1. ...

weixin_34128534的博客 343

掌握Direct3D精灵绘制技术与应用

本章深入探讨了在Direct3D环境下使用精灵绘制技术,并展示了如何创建精灵处理器结构以及如何利用缩放与半透明效果来丰富游戏画面。通过详细代码示例,讲解了如何加载纹理、初始化精灵、绘制精灵以及如何在游戏中应用这些技术。

weixin_32251525的博客 455

解决西门子Step 7 basic 找不到许可证问题

你在使用博图软件是否遇到过Step 7 basic 找不到许可证的问题呢!不言怕,今天我就来告诉你该如何处理吧!看步骤: 1.删除原授权的License: 打开Automation License Manager应用,然后我们可以发现仅有的License Key前面有一个时钟,说明它已经过期不可用,我们就要去寻求新的Key. 打开“我的电脑”,选择C盘,点击上方查看 点击选项–>查看 然...

让技术没有门槛 14万+

Direct3D学习(五):基于高度图的地形生成

地形生成有许多方法,其中最广泛的就是利用高度图。相信大家对中学学过的地理还有点印象吧?一幅地图不同海拨用不同的颜色表示,即等高线表示法。高度图基于同样的原理,只不过这里的高度值表现为图像中的亮度值。在高度图中,高度值表现为0~255之间的明暗值,如图所示:screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.

逍遥剑客 6308

K8s入门教程(一)

本教程提供了Kubernetes(K8s)的入门指南,涵盖了从基础概念到实战操作的全面内容。首先介绍了Kubernetes的定义和核心功能,如自动化部署、弹性伸缩、自我修复等。接着,详细讲解了如何在macOS上安装Minikube和kubectl工具,以及如何使用这些工具创建和管理Pod、Deployment和Service等核心资源。教程还包括了实战案例,如部署Nginx应用,并介绍了高级特性如滚动更新和自动伸缩。最后,提供了常见问题的解决方案,帮助用户快速上手和解决实际使用中的问题。

2401_82505179的博客 1689

Direct3D中绘制图元的两种方式

DirectX 中绘制图元有两种类型的函数,一个是DrawPrimitiveUp,一个是DrawPrimitive,当然跟索引相关的也有两个类似的函 数,一个DrawIndexedPrimitiveUp,一个是DrawIndexedPrimitive; HRESULT DrawPrimitiveUP(   [in]  D3DPRIMITIVETYPE PrimitiveType,  

eskimoer的专栏 2330

从零开始:如何用Python手绘波特图并分析电路稳定性

本文详细介绍了如何使用Python绘制波特图并分析电路稳定性,涵盖从基础理论到实际应用的完整流程。通过NumPy和Matplotlib实现频域分析,包括RC低通滤波器和RLC带通滤波器的案例,以及相位裕度计算等高级技巧,为电子工程师提供了一套高效的电路分析解决方案。

hhh00的博客 371

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2154

Direct3D绘制流水线

文章介绍了绘制流水线及其每一阶段所要完成的任务。

Spring_24的博客 1170

华为OD机考双机位C卷 - 斗地主之顺子 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 斗地主之顺子(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 9692

关于Direct3D绘制的顶点顺序

关于Direct3D绘制的 首先D3D有三种基本图元,外加三种绘制方式,有六种组合,默认顶点顺序是顺时针绕序,虽然如此,但是在实际绘制时,有一些变通之处,使人迷惑。 一、列,包括点列,线列和三角形列: 这个不需要多说,因为互相之间没有共享元素(虽然可能有重叠现象,但不能算作共享),所以按顺序给出所有顶点即可,如果有重叠的点,也需要重复给出。其中点列和线列没有顺序一说,三角形...

qq_41940565的博客 574

Dify智能体开发:Dify文件上传

相较于聊天文本,文档文件能够承载大量的信息,例如学术报告、法律合同。受限于 LLM 自身仅能够支持文件或图片,难以获取文件内更加丰富的上下文信息,应用的使用者不得不手动复制粘贴大量信息与 LLM 对话,增加了许多不必要的使用成本。

王国平的博客 2590

【大语言模型 21】语言模型训练目标:MLM vs CLM vs GLM对比分析

本文深入对比分析三种主流语言模型训练目标:掩码语言模型(MLM)、因果语言模型(CLM)和双空白填充(GLM)。通过数学推导、代码实现和实验对比,揭示不同训练目标的工作机制、适用场景和性能差异,为选择合适的预训练策略提供科学指导。

熵数实验室 1176

Direct3D 2D文本绘制

现在学习下Direct3D在窗口中绘制一些文本信息,ID3DXFont接口负责创建字体和绘制二维的文本.我们介绍下ID3DXFont的用法. 1.创建LPD3DXFONT接口 LPD3DXFONT g_pTextInfor = NULL; //创建字体 D3DXCreateFont(g_pd3dDevice, //...

weixin_30764883的博客 187

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Direct3D中的绘制(2)

Direct3D提供了多种渲染状态,它影响几何物体怎样被渲染。渲染状态有默认值,因此假如你的应用程序需要不同于默认设置的渲染时,你仅仅改变它即可。一种渲染效果会一直起作用,直到你下一次改变渲染状态为止。为了设置一个渲染状态,我们使用下面的方法: Sets a single device r...

chubaisheng8627的博客 110

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

Direct3D 中绘制二维图像

2014/09/25 (转载自:http://www.cnblogs.com/WonKerr/archive/2009/05/18/direct3d_surface_2d.html) 因为二维的游戏已经逐渐减少并且显卡对二维的支持也不再增加新的功能,所以从 DirectX7开始,DirectDraw 被逐渐淡化,代之的是 Direct3D ,但是在3D 中有时也是需要绘制二维的,且不说

narutojzm1的博客 992

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

第七章 利用Direct3D绘制几何体

CPU(除了要执行其它必要的工作)需要构建i提交命令列表,而GPU则负责处理命令队列中的各种命令。我们的目标是让CPU和GPU持续的工作,从而充分的利用硬件资源。为此提出了一个方案:以CPU每帧都需要更新的资源作为基本元素,创建一个环形数组。我们称这些资源为帧资源,而这种循环数组通常是由3个帧资源元素所构成。该方案的思路是:在处理第n帧的时候,CPU将周而复始地从帧资源数组中获取下一个可用的帧资源。趁着GPU还在处理此前帧之时,CPU将为第n帧更新资源,并构建提交对应的命令队列。随后,CPU会继续针对第n+

m0_57958061的博客 727

在 Direct3D 中绘制二维图像

因为二维的游戏已经逐渐减少并且显卡对二维的支持也不再增加新的功能,所以从 DirectX7开始,DirectDraw 被逐渐淡化,代之的是 Direct3D ,但是在3D 中有时也是需要绘制二维的,且不说材质贴图的支持,就是一般的游戏特效(例如在近景是三维的,但是当镜头拉伸到较远的距离时,直接显示二维的地形图)也是需要二维处理的,当然在 Direct3D 中二维的处理方式比较多,最常用的是创建遮盖...

weixin_30731305的博客 275

Direct3D 初涉: Direct3D 中的绘制

1.顶点缓存和索引缓存(vertex/indexbuffer) 一个顶点缓存是一个包含顶点数据的连续内存空间;一个索引缓存是包含索引数据的连续内存空间。顶点缓存和索引缓存可以被放置到显存(videomemory)中。进行绘制时,使用显存中的数据将获得比使用系统内存中的数据(Array)快得多的速度。 1.1创建 顶点缓存用接口IDirect3DVertexBuffer9表示,用C...

weixin_34357962的博客 79
上一篇: DIRECTX9.0绘制流水线
下一篇: DirectX9.0 着色
dingdingko
博客等级 码龄20年 50粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值