在C++与Hlsl绑定Cbuffer数据的时候,非常容易出错,出错的根本原因是C++对数据结构内存的分配与hlsl不同。
重要:HLSL的结构体struct其实并不管你是一个变量还是几个变量,它就是按照一次放满一个float4的内存长度,多少变量都往一个float4里面塞,塞满了再接着塞下一个float4。测试结果显示:cbuffer的长度必须是float4的整数倍才行,不知道float+float3的这种组合是否可以正常获取数据,也不清楚float+float+float3+float3这种组合能不能正常分配到数据,关键取决于GPU的内存分配规则。
在进入渲染管道后,如果CPU出现了要修改buffer或者其它类型数据的时候,不可能重新new一个buffer塞进去。这个时候需要一种机制能够修改已经进入管道的数据,这种机制就是Map和Unmap机制。其本质就是对数据加锁导致GPU不能修改,然后CPU对其进行修改,修改完后还原。
Map:获取的数据中包含一个子资源的指针,并拒绝该子资源的访问GPU。
HRESULT Map(
ID3D11Resource *pResource, // 需要修改的源,类型不是buffer,这说明map还可以修改状态值。
UINT Subresource, // 子资源的位置
D3D11_MAP MapType, // 这是一个枚举类型:D3D11_MAP_WRITE_DISCARD,D3D11_MAP_WRITE_NO_OVERWRITE
UINT MapFlags, // 一个可选标准,不懂
D3D11_MAPPED_SUBRESOURCE *pMappedResource // 返回的内容
);
typedef struct D3D11_MAPPED_SUBRESOURCE {
void *pData; // 传说中我们可以修改的东东
UINT RowPitch; // 对某一行的某个像素
UINT DepthPitch; // 对应某一行,这两个参数最好不用
} D3D11_MAPPED_SUBRESOURCE;
Unmap:无效的指针指向的资源,并重新启用GPU的访问该资源。
void Unmap(
ID3D11Resource *pResource,
UINT Subresource
);
例子:
m_immediateContext->Map(matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
// 得到const buffer指针.
dataPtr = (TransitionMatrix*)mappedResource.pData;
// 设置transform矩阵.
D3DXMATRIX worldMatrix;
D3DXMatrixIdentity(&worldMatrix);
Matrix4 transform = D3DXMatrix2Matrix4(worldMatrix) * cameraManager->getView() * cameraManager->getPerspective();//D3DXMatrix2Matrix4(viewMatrix) cameraManager->getView()
dataPtr->transform = transform.Transpose(); // 矩阵需要转置
m_immediateContext->Unmap(matrixBuffer, 0);
此文主要是想演示一下如何修改资源。
分享到:
相关推荐
典型的管道可能会从一组CSV文件或数据库表中提取数据,使用给定的架构将它们转换为JSON,将它们组合成RDF图,执行重复数据删除和数据集成,最后对结果进行一组查询图形。 阶段 图形处理管道应支持以下阶段/操作: ...
Bug ID 4724038 (fs) Add unmap method to MappedByteBuffer
进程用户空间布局 参考之前对vmalloc函数实现的分析,vmalloc时是从内核页表的pgd开始逐层生成并建立页表,vmalloc_to_page就是对应的逆过程,先找到虚拟地址对应的页表...此处注意pte_offset_map和pte_unmap的配对使用
promiseUnmap 与相似,具有一些含义:...const {promiseUnmap} = require('promise-unmap')或import {promiseUnmap} from 'promise-unmap' 它接受一组诺言或返回诺言的函数。 const { promiseUnmap } = require ( '
3.5.3 unmap_region()函数 155 3.6 创建和删除进程的地址空间 156 3.6.1 创建进程的地址空间 156 3.6.2 删除进程的地址空间 175 3.6.3 内核线程1号的地址空间 176 3.7 堆的管理 178 第四章 磁盘文件内存映射 182 4.1...
桨板-DALL-E OpenAI的DALL-E的PaddlePaddle版本实现。 现在,此实现仅包含dVAE部分,无法从文本生成图像... functional as TFfrom PIL import Imagefrom dall_e import load_model , map_pixels , unmap_pixelstarget_i
unmap every target buffer right before and after its DMA is processed, thereby restricting DMAs to their designated locations. This usage model, however, is not truly secure for two reasons: (1) it ...
上下文路由插件这是一个Cloud Foundry ...lite.com apphost /v2 地图上下文路由cf map-context-route APP DOMAIN HOST PATH 例子cf map-context-route myapp bosh-lite.com apphost /v2 取消映射上下文路由cf unmap-co
使用map命令将更改应用到键盘。 固件不允许您重新编程基础层上的Fn键。 重置密钥配置 使用unmap命令将键盘重置为默认状态。 更高级的设置 如果要进行更高级的设置,请使用支持的 PCB,例如 。
Read a root item from the tree for Embedded Linux.
int ioctrl_unmap(uint32_t *addr_ptr, size_t block_len) int ioctrl_set(uint8_t mode) GPIO fuctions: int gpio_init(void) int gpio_cleanup(void) int gpio_set_input_mode(void) int gpio_set_output_...
)u ^ R〜^ L ^ G m @ qr R a A i I o O&s S ZZ *:wasavi支持以下ex命令:*缩写cd chdir复制删除编辑文件文件系统全局联接k映射标记标记移动选项打印放置pwd退出读取重做s&〜将寄存器设置为不缩写undo unmap版本v...
crossbar domain unmap - unmap a crossbar<->irq connection for Linux v2.13.6.
Once we get the RDS_PAGE_LAST_OFF frag then rds_iw_frag_unmap() must be called on this recv. This happens as completions hit in order or on connection shutdown.