DirectX 11 Particle System With StreamOut

2024-05-24 18:18

本文主要是介绍DirectX 11 Particle System With StreamOut,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编写DirectX 11 应用程序时,我们通常是将数据发送到GPU,然后在GPU中对数据进行计算,处理,渲染出图像

但当我们需要从GPU中获得数据该怎么办,SteamOut,顾名思义,可以将GPU中的数据流输出到CPU中


在设计粒子系统时,我们需要做的三件事情是:

一:初始化粒子

二:更新粒子

三:渲染粒子

通常而言,一、二都是在CPU中完成,三由GPU完成

但是由于我们有StreamOut,我们可以将粒子的更新也由GPU完成,充分利用GPU的计算能力

将更新后的粒子通过StreamOut输出到CPU中


那么现在我们考虑这么几个问题,StreamOut输出的数据存放在哪里,如何实现StreamOut

下面对其进行讲解:

StreamOut输出的数据是输出到ID3D11Buffer中,就如同VertexBuffer一样,将其储存在Buffer中

则StreamOut输出的数据的缓存StreamOutBuffer , 与VertexBuffer的顶点格式是相同的


粒子系统中我们通常的做法是:

先使用StreamOut对粒子进行更新,将更新后的粒子存储于Buffer1中,然后再经更新后的粒子绘制出来,并作为下一帧的输入缓存

由于同一个缓存不能同时绑定两个阶段,则此时我们需要两个缓存,一个用于接收StreamOut更新后的粒子,一个用于绘制,并作为下一帧的输入缓存

即:

IA Input : Buffer2

StreamOut ------> Buffer1

Buffer1    swap data    Buffer2    // 交换Buffer1和Buffer2中的数据,则此时Buffer2中保存是更新后的粒子数据    

Render with Buffer2                    // 由于此时保存的是更新后的粒子数据,因为渲染的结果是更新后的场景  , 并且在下一帧这些的粒子作为输入被再次更新


在这里我们介绍一下SOSetTarget

void SOSetTargets([in]  UINT NumBuffers,[in]  ID3D11Buffer *const *ppSOTargets,[in]  const UINT *pOffsets
);

该函数设置StreamOut输出数据的目标缓存,传入一个缓存数组,NumBuffers表示该数组中缓存的个数,pOffsets表示各缓存在缓存数组中的索引偏移量

如:

UINT offset = 0;
ID3D11Buffer* mParticleSystemStreamOutVertexBuffer = NULL;//Init mParticleSystemStreamOutVertexBuffer
...deviceContext->SOSetTargets( 1 , &mParticleSystemStreamOutVertexBuffer , &offset );

将缓存从StreamOut阶段解绑,只需将空缓存数组绑定到SO阶段,即可解绑,如下:

UINT offset = 0;ID3D11Buffer* BufferArray[1] = { 0 };
deviceContext->SOSetTargets( 1 , BufferArray , &offset );


更新粒子可以通过GeometryShader来完成

该粒子系统使用两种技术:

一:通过StreamOut更新粒子,不渲染

二:渲染粒子


这里需要介绍一个函数:

HRESULT CreateGeometryShaderWithStreamOutput([in]   const void *pShaderBytecode,[in]   SIZE_T BytecodeLength,[in]   const D3D11_SO_DECLARATION_ENTRY *pSODeclaration,[in]   UINT NumEntries,[in]   const UINT *pBufferStrides,[in]   UINT NumStrides,[in]   UINT RasterizedStream,[in]   ID3D11ClassLin

这篇关于DirectX 11 Particle System With StreamOut的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999162

相关文章

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

System.getProperties().

Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

Linux函数fcntl/system学习

本文针对项目中用到的几个函数进行详细分析,并尽可能的添加示例进行验证学习。比如fcntl/ioctl函数、system/exec函数、popen/pclose函数、mmap函数等。 重点参考了《UNP》和《Linux程序设计》第四版。 一、fcntl函数 fcntl函数可以改变或者查看已打开文件的性质。该函数的定义如下: #include <fcntl.h> int fcntl(

【UVA】11400-Lighting System Design(动态规划)

这道题感觉状态式不是很好推。。。 WA了好几次是因为排序的时候出问题了。 这道题出在线性结构里了,先说一下最长上升子序列吧。 dp[i]代表了以array[i]结尾的时候,最长子序列长度。 推导的时候,以起点递增的顺序进行推导。 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#i

解决PHP Warning: strftime(): It is not safe to rely on the system's timezone set

当运行一些程序时,在httpd日志中会有如下警告日志: PHP Warning:  strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set(