D3D中的顶点缓存

菜鸟DirectX之顶点缓存 在游戏中,物体模型是用多边形网格来描述的,一般的是三角形,dingdian 阅读详情

当"allocating vertex buffers_分配顶点缓存"时:

当使用 STATIC(这个是.net 情况,对于非.net版本dx是没有指定D3DUSAGE_DYNAMIC)标识分配顶点缓存时,这块缓存位于显存中。它的典型应用是只写一次并不被读回内存的情况。 
只有当标志 D3DUSAGE_DYNAMIC被设置时 D3DUSAGE_WRITEONLY标志才有意义。 
如果使用DYNAMIC标志创建缓存 (使用D3DUSAGE_DYNAMIC创建的缓存) ,并且D3DUSAGE_WRITEONLY 被使用,缓存被分配到显存中。

如果使用DYNAMIC标志创建缓存 (使用D3DUSAGE_DYNAMIC创建的缓存) ,并且D3DUSAGE_WRITEONLY 不被使用, 缓存被分配到AGP 缓存中。(CPU从AGP缓存中读取的速度比显存中快,但比内存慢,是个很好的折中) 
如果没有足够的显存,顶点缓存被分配到AGP缓存中;如果AGP缓存也不够时,创建失败,除非使用POOL_ MANAGED 创建。在这种情况下,D3D的运行库会释放足够多的显存,用来创建顶点缓存,并在内存中保存创建的缓存的一个拷贝。那些被运行库释放的显存,在需要它们时可以从内存中复制到显存中。注意标志POOL_ MANAGED 并不被发送到驱动程序,因为这是D3D的附加的功能。

对于NV1X 系列的GPUs, 在进行多数据流渲染得时候,如果有一个顶点缓存位于AGP缓存中,所有的其他位于显存中的顶点缓存会被移动到AGP缓存中。 

当" locking vertex buffers_锁定顶点缓存"时:

如果顶点缓存的创建标志是POOL_DEFAULT: 

如果没有指定任何标志,程序将被暂停,因为它强制程序和GPU同步操作。->低效

如果指定D3DLOCK_NOOVERWRITE 标志,应用程序不会改变缓存区已存在的内容,运行库会在以后继续使用这块缓存。当应用程序调用这个函数时,驱动程序立即返回。->高效

如果指定D3DLOCK_DISCARD 标志,程序将会更新整个缓存的值,实际上是分配一块新的缓存,即驱动程序重命名它。->高效

[注解:因为CPU和GPU是异步的操作,所以当CPU通过系统总线和GPU同步时,需要等到GPU把当前的工作做完。例如,当GPU正在对一块缓存进行DMA操作时,但往往CPU并不对GPU操作的那块缓存进行操作,所以CPU可以和GPU一起工作。当不指定操作标志时,CPU等待GPU完成绘制工作才更新顶点缓存,所以低效。如果指定D3DLOCK_NOOVERWRITE,表示CPU只更新顶点缓存中剩余的缓存,不考虑是否有其他图形绘制是正在使用这个的缓冲区段绘制图形,强制更新那段缓存并返回,而不像默认参数0那样等待前面的绘制结束,而不更新已经写入的顶点值,所以在CPU写入的时候,GPU可以并行的对那些已经存在的顶点值进行DMA等操作,所以高效;如果使用D3DLOCK_DISCARD 标志,说明当前分配的缓存大小不够了,需要重新使用缓存,CPU对这些新分配的缓存区域进行写操作,GPU这时可能还在异步处理旧的缓存区,所以这种调用也是高效的。调用完毕,收回释放的缓存。]


来自 GameRes 说明了 Lock 的标志含义,我改了一部分内容。因为 D3DLOCK_NOOVERWRITE 和 D3DLOCK_DISCARD 是要经常使用的。越熟练越好
NOOVERWRITE 并不是不覆盖数据,如果2个三角形在缓存中地址相同。后面定点内容会覆盖前面的。而前面的三角形将不能画出来。

如果缓冲区开的足够大,render 几帧才能使用完这个缓冲。可以一直使用NOOVERWRITE 就可以。当不够使用时在从头开始使用这个顶点缓冲。如果足够大。开头的顶点基本确定已经画完(都是前几帧的图形顶点内容了。被覆盖也无所谓),如果缓冲很小lock时可以调用DISCARD,表示丢弃缓冲区内容(被丢弃的内容如果在使用中还可以被GPU继续使用。NOOVERWRITE 不会保留,所以速度更好)。如下使用开头的6个顶点画2个四边形。但该用NOOVERWRITE 将之后后面的四边形

   Quad->Lock(0, 6*sizeof(Vertex), (void**)&v, D3DLOCK_DISCARD);

   // quad built from two triangles, note texture coordinates:
   //v += 6;
   v[0] = Vertex(0.0f, 0.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
   v[1] = Vertex(0.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
   v[2] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

   v[3] = Vertex(0.0f, 0.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
   v[4] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
   v[5] = Vertex( 1.0f, 0.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

   Quad->Unlock();

   Device->SetTexture(0, Tex1);
   Device->SetStreamSource(0, Quad, 0, sizeof(Vertex));
   Device->SetFVF(Vertex::FVF);
   Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

   Quad->Lock(0, 6*sizeof(Vertex), (void**)&v, D3DLOCK_DISCARD);
     // quad built from two triangles, note texture coordinates:
   v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
   v[1] = Vertex(-1.0f,  0.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
   v[2] = Vertex( 0.0f,  0.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

   v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
   v[4] = Vertex( 0.0f,  0.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
   v[5] = Vertex( 0.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

   Quad->Unlock();

   Device->SetTexture(0, Tex);
   Device->SetStreamSource(0, Quad, 0, sizeof(Vertex));
   Device->SetFVF(Vertex::FVF);
   Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

当使用 D3DLOCK_NOOVERWRITE  标志时,似乎Lock 使用偏移地址没什么意义.或许可以提高性能

OpenGL中的顶点缓冲区(Vertex Buffer) Vertex buffer即顶点缓冲区。从字面意思来看,这个词就是指储存是顶点数据的缓冲区,本质还是一个缓冲区(buffer),是占一定字节的内存。就像在C++中我们用声明并赋值一个int类型,在内存中开辟4个字节空间来储存数据,这是在CPU上进行的。而Vertex buffer是OpenGL在GPU中开辟空间储存数据。当我们运行程序绘制图形时,显卡会从缓存(buffer)中读取顶点数据,进行绘制。 今天我们来看一下如何用OpenGL来创建顶点缓存区(vertex buffer)。我个人感觉这个过程和编程 阅读详情

相关推荐

D3D学习二:顶点缓存Vertices

最近真的是忙得要死了,所有课都开了,要应付必修课,又要准备设计师考试,三头六臂都不够用了,还好每天还能勉强的抽点时间学D3D。今天早上梦到了猪和去学开飞机了,好兆头,只要努力就能够成功。 开始一时大意在创建注册窗口和创建窗口是把窗口名称搞错了,查了半天才弄出来,忙活得够呛了,还

新起点,高展望,远征途 2150

DirectX中使用顶点缓存

介绍         虽然DirectX 8已经出来许久了,但是很多人似乎在如何正确使用顶点缓存上遇到问题。即使随便去那些DirectX论坛上看一眼,都会发现很多困惑的程序员或者游戏开发者在抱怨为什么他们的游戏的帧率没有他们认为的那么高。         为了给那些需要的人提供帮助,我决定弄一个小的帮助文档帮助那些人解除疑惑。(需要说明的是我没有写什么‘新’的东西,我只是将那些MSDN和其他的

my_et的专栏 1233

DirectX11 顶点缓存

为了让GPU访问顶点数组,我们必须把它放置在一个称为缓冲(buffer)的特殊资源容器中,该容器由ID3D11Buffer接口表示。用于存储顶点的缓冲区称为顶点缓冲(vertex buffer)。Direct3D缓冲不仅可以存储数据,而且还说明了如何访问数据以及数据被绑定到图形管线的那个阶段。要创建一个顶点缓冲,我们必须执行以下步骤:1.填写一个D3D11_BUFFER_DESC结构体,描述我们所要

梦幻DUO的游戏开发之路 5855

Director3D中的绘制——顶点缓存和索引缓存

一个顶点缓存是储存有顶点数据的连续空间,一个索引缓存是储存有索引数据的连续空间,使用顶点缓存和索引缓存来表示相关的数据,而不使用数组来表示的原因是因为:顶点缓存和索引缓存储存在显存中,在处理的时候能够获得比系统内存更快的处理速度。 在代码中,顶点缓存使用的接口IDirectorVertexBuffer9表示,索引缓存使用的是IDirectorIndexBuffer9表示。 创建顶点缓存和索引缓...

Gary的面包屑小道 796

浅谈D3D透视-一

目前大部分游戏通过Direct3D实现3D效果,通过挂钩相应函数,可以实现3D透视,屏幕挂字效果。而透视,屏蔽特定效果,设置透明在很多游戏(特别是FPS)中发挥着巨大的作用!D3DDirectX的功能都是以COM组件的形式提供的。在Direct3D中,主要通过采取以下操作来实现编程: 调用适当的函数获取接口指针; 调用接口的方法(成员函数)来完成所需功能; 用完接口后,调用Release方

Night May Say 4397

【Visual C++】游戏开发笔记三十六 浅墨DirectX提高班之四 顶点缓存的逆袭

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接: http://blog.youkuaiyun.com/zhmxy555/article/details/8276363作者:毛星云(浅墨)    邮箱: happylifemxy@163.com     顶点永远是3D图形学中不可或缺的元素。这篇文章里我们首先对3D世界里的一些概念和常识进行了阐述,然后详细剖析了顶点缓存相关的知识点,

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 4万+

D3D9学习笔记之顶点缓存与索引缓存

D3D9学习笔记 顶点缓存与索引缓存 顶点缓存与索引缓存可以被放置在显存中,绘制时使用显存中的数据比使用系统内存中的数据要快的多。 顶点缓存与索引缓存在D3D9中的表示: 顶点缓存 IDirect3DVetrexBuffer9 索引缓存 IDirect3DIndexBuffer9 创建顶点缓存和索引缓存: 可以用如下2个方法创建 HRESULT IDirect3DDevice9::CreateVe...

weixin_44202285的博客 1305

D3D的绘制函数总结

关于绘制batch和性能优化每个设置设备状态到发出绘制命令的转换都将产生一个Batch( [bætʃ]一批 )。动态顶点缓冲的推荐使用模式是一个可以合并Batch的模式,即不断地填充顶点数据,但不立刻绘制,在缓冲填满时才提交绘制一次,当然能合并的前提是各个batch都使用相同的设备状态,即纹理、材质、RenderStates、变换矩阵等。DrawPrimitive渲染一个没有索引编制的序列,在数据

自由理想的足迹 6601

D3D 顶点缓存的设计

D3D 顶点缓存的设计 这一步的关键词是设计,Design。  如果我们要研发一部手机,首先要进行策划,做好设计图纸。使用顶点缓存也是一样,想要使用顶点缓存绘制图形,第一步的工作就是对顶点的类型进行设计。今天我们要介绍的一套顶点格式,是固定功能流水线中使用频繁的一套顶点定义格式——灵活顶点格式(Flexible Vertex Format,FVF)。需要说明的是,与灵活

水上漂的专栏 3783

LabVIEW通过ActiveX控件实现与三菱FX5U PLC的高效数据交互

本文详细介绍了如何利用LabVIEW的ActiveX控件,通过三菱官方MX Component工具包实现与FX5U PLC的高效数据交互。文章从环境配置、控件插入到实战代码解析,系统讲解了连接建立、数据读写及资源释放的全流程,并提供了关键的避坑指南,帮助工程师快速构建稳定可靠的上位机通讯系统。

weixin_29197051的博客 373

FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)

本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。

weixin_29239661的博客 332

D3D学习笔记(七)

几何信息 ID3DXBa

tiger1334的专栏 746

计组实验5:cache大小测量与 cache line 大小测量

前言 今天做了实验5,通过 c 语言测 cache 参数。其实按理来说挺简单的,只是我们班没给代码,纯靠自己。听说别的班有给代码 emm 因为《深入理解计算机系统》这本书上面给的代码是 Linux 平台下的,而且需要一个 fcyc2 头文件,可以在 https://github.com/fabiensanglard/CpuCacheMountainViewer 这里找到。 ⚠ 我没有在 Linux 下试过课本上面的代码。。。 我是在 win10 下测试的。。。 所以 。。。 我并不确定我的代码是否正确。

AKGWSB 's blog 1万+

D3D9 简单图形的绘制以及显示

程序截图所示: 要想完成这样的程序,首先咱们先得知道以下几点才能进行绘制并且显示: 一、了解什么是D3D9的绘制流水线: 1.局部坐标系: 主要用于在使用3D建模时,所使用的坐标系,无需考虑它相对于场景中其他物体的位置,大小。通常在创建模型时,建模人员都会将模型围绕原点进行建模,那样将有助于坐标变换,比如让模型旋转起来,在我们将坐标变换时将会进行描述。 ...

冷崖的博客 1万+

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling

今天在开实验室开双系统台式机时,ubuntu 20.04 系统下,突然在某次关机后再开机时,本来启动好好的,但是在进行图形化启动时,本来应该是显示输入账号和密码时,直接黑屏报错了,内容为 hdaudioC0D2: unable to configure disabling ,这里是记录了报错的解决全过程

qq_48717745的博客 990

ESP32S3开发实战:从Vscode+IDF环境配置到OpenOCD单步调试全流程

本文详细介绍了ESP32S3开发环境的完整搭建流程,重点讲解如何在Vscode中配置ESP-IDF开发框架,并利用OpenOCD工具实现硬件单步调试。内容涵盖从环境准备、工程创建、代码烧录到高级调试技巧的全方位实战指南,旨在帮助开发者快速掌握ESP32S3的高效开发与调试方法。

weixin_29168813的博客 208

D3D中的AGP内存、系统内存、显存

学习D3D,应该对这三个内存理解,网上收集了一下相关资料,收藏下来。 三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡内存都很小,那时还是在显存是16M,32M为主流的时候,如果

1366

蓝牙EDR模式中GFSK调制如何过渡到DPSK调制

这两份文档片段揭示了蓝牙Modem设计中非常精深的部分。它的核心思想是:通过精心的脉冲形状设计和重叠,来保证幅度连续;通过在保护间隔内执行一套复杂的“相位平滑算法”(重复、斜率保持、寻找基准点、冻结),来保证相位连续。Figure 3-2 则是将这个思想用图形化的方式展现出来,说明了脉冲在时间轴上的对齐和叠加关系。这种设计确保了发射机能够严格符合蓝牙规范的要求,实现不同调制方式之间的平滑、无毛刺切换,从而保障了通信的可靠性和高效的频谱利用率。

m0_49540263的博客 283

D3D11中的绘制

两种绘制方式:   1、 使用顶点缓存进行绘制 (1) 创建顶点缓存   a) 声明一个描述顶点数据的结构   b) 使用实际的顶点数据填充顶点结构数组   c) 创建一个D3D11_BUFFER_DESC对象(a buffer description),将其BindFlags成员赋值为D3D11_BIND_VERTEX_BUFFER, ByteWidth成员赋值为顶点对象数组    ...

weixin_34198762的博客 546

YOLOv10改进 | 主干篇 | 引入FasterNet:Run, Don‘t Walk,追求更快的神经网络

本文引入了 FasterNet 作为 YOLOv10 的主干网络。通过 PConv 算子,我们有效降低了模型的计算冗余。对于追求极致推理速度的场景(如树莓派、Jetson Nano),该改进方案极具价值。建议在训练时配合混合精度训练 (AMP)进一步加速。

weixin_51988935的博客 604

Fiori Elements 的 Adapting the UI: Analytical List Page 全解析与实战

摘要:本文详细介绍了如何通过SAP Fiori elements的UI Adaptation功能对Analytical List Page(ALP)进行细粒度适配。重点讲解了页头过滤区、图表区域、表格区域等关键组件的可配置属性,包括过滤区折叠/固定、图表类型限制、表格滚动阈值等实用功能。文章强调这些适配均可通过可视化工具完成,无需修改业务代码,并提供了典型场景的实践清单。适用于SAP Fiori elements for OData V2项目,建议配合SAP Fiori tools的Adaptation E

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

我对D3D中的顶点缓存的概念感到迷惑,特别是其分配和锁定的操作,不知道这些名称的含义是什么(转载)?...

当"allocating vertex buffers_分配顶点缓存"时: 当使用 STATIC(这个是.net 情况,对于非.net版本dx是没有指定D3DUSAGE_DYNAMIC)标识分配顶点缓存时,这块缓存位于显存中。它的典型应用是只写一次并不被读回内存的情况。 只有当标志 D3DUSAGE_DYNAMIC被设置时 D3DUSAGE_WRITEONLY标志才有意义。 如果使用DYNAM...

weixin_34191734的博客 267

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【游戏逆向】D3D HOOK实现透视讲解

在消隐时,Direct3D先用背景色(或纹理)填充渲染表面,Z缓存则统一设置成最大深度,即投影变换中后裁剪平面的距离,然后逐像素处理渲染表面:对于任意一个像素,Direct3D逐一测试所有与该像素重叠的三角形,如果三角形中像素对应点的Z坐标小于Z缓存中的数值,也就是说,此三角形离观察者较近,则像素取该点的颜色,同时像素在Z缓存中的深度也设为该点的Z坐标,然后继续测试下一个三角形…这些图元分为点列,线列,线带,三角形列,三角形带,三角扇形。顶点缓存通常除顶点坐标之外还包括法线,颜色,纹理等数据。

douluo998的博客 1918

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: D3DLOCK_NOOVERWRITE。D3DLOCK_DISCARD lock 和unlock
下一篇: [翻译]D3DPOOL
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值