https://github.com/ConfettiFX/The-Forge/blob/master/CommonRaytracing_3/ThirdParty/DXR/doc/D3D12%20Raytracing%20Functional%20Spec.docx

dxr的spec 好难找

D3D12 Raytracing Functional Spec

https://github.com/NVIDIAGameWorks/Falcor/releases

https://github.com/Microsoft/DirectX-Graphics-Samples/blob/master/Samples/Desktop/D3D12Raytracing/readme.md

https://github.com/Microsoft/DirectX-Graphics-Samples/blob/master/Libraries/D3D12RaytracingFallback/readme.md

http://forums.directxtech.com/index.php?topic=5860.0

初始化拿到device 对rtx开一些特殊设置

fallback是个模拟rtx的库 api和硬件的rtx不太一样要专门写

初始化各种资源 初始化rtx专有资源

pso

as

加速结构 top bottom

top是对bottom的一个transform 数据本身在bottom

可以有一组bottome 每个里面又可以有很多geometry

语法参见        bottomLevelBuildDesc.NumDescs = static_cast<UINT>(geometryDescs.size());

它公用dx12的cmd自己再这个cmd上面建一个rtx的cmd

有五种shader可以写

hit 里面的光照是 光线打到的物体上的光照 比如反射 了abc 是abc物体的光照 而不是反射平面本身的材质光照

从传统光栅化shader到这种hit的光照shader的转换

vs部分的pos normal uv之类的 从hit的结果能拿到

只port ps光照部分即可 返回光照结果

几天没见pix长进了

https://blogs.msdn.microsoft.com/pix/gpu-captures/

看上去不错

https://blogs.msdn.microsoft.com/pix/2018/07/24/pix-1807-19-shader-table-viewer/

dx12和dxr都可以debug 需要把dxr的dll copy到pix.exe的位置

gpu hang的debug

https://blogs.msdn.microsoft.com/pix/tdr-debugging/

https://docs.microsoft.com/zh-cn/windows/desktop/direct3d12/using-d3d12-debug-layer-gpu-based-validation

https://blogs.msdn.microsoft.com/pix/programmatic-capture/

很强大

https://blogs.msdn.microsoft.com/pix/remoting/

远程连接

---------------------------

dx12 rootsignature  ---SRV CBV UAV 初始到各个slot

m_device->CreateConstantBufferView(&cbvDesc, m_cbvHeap->GetCPUDescriptorHandleForHeapStart()); 用这句连

CB--View --descriptorHeap

init 的时候把这些连上

render的时候 用这种方式更新 m_commandList->SetGraphicsRootDescriptorTable(0, m_cbvHeap->GetGPUDescriptorHandleForHeapStart()); 用heap更新slot

update更新了cb本身

dxr里面有shadertable 是upload buffer--committed resource

一条layout是一个shader rootsig mat等等

auto DispatchRays = [&](auto* commandList, auto* stateObject, auto* dispatchDesc)
{
dispatchDesc->HitGroupTable.StartAddress = m_hitGroupShaderTable->GetGPUVirtualAddress();
dispatchDesc->HitGroupTable.SizeInBytes = m_hitGroupShaderTable->GetDesc().Width;
dispatchDesc->HitGroupTable.StrideInBytes = m_hitGroupShaderTableStrideInBytes;
dispatchDesc->MissShaderTable.StartAddress = m_missShaderTable->GetGPUVirtualAddress();
dispatchDesc->MissShaderTable.SizeInBytes = m_missShaderTable->GetDesc().Width;
dispatchDesc->MissShaderTable.StrideInBytes = m_missShaderTableStrideInBytes;
dispatchDesc->RayGenerationShaderRecord.StartAddress = m_rayGenShaderTable->GetGPUVirtualAddress();
dispatchDesc->RayGenerationShaderRecord.SizeInBytes = m_rayGenShaderTable->GetDesc().Width;
dispatchDesc->Width = m_width;
dispatchDesc->Height = m_height;
commandList->DispatchRays(stateObject, dispatchDesc);
};

DispatchRays 可以把三种shader的起始地址连上

cbv之类的更新同dx12

namespace RootSignatureSlots = LocalRootSignature::AABB::Slot;
CD3DX12_ROOT_PARAMETER rootParameters[RootSignatureSlots::Count];
rootParameters[RootSignatureSlots::MaterialConstant].InitAsConstants(SizeOfInUint32(PrimitiveConstantBuffer), 1);
rootParameters[RootSignatureSlots::GeometryIndex].InitAsConstants(SizeOfInUint32(PrimitiveInstanceConstantBuffer), 2);

ThrowIfFailed(D3D12SerializeRootSignature(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, &error), error ? static_cast<wchar_t*>(error->GetBufferPointer()) : nullptr);
ThrowIfFailed(device->CreateRootSignature(1, blob->GetBufferPointer(), blob->GetBufferSize(), IID_PPV_ARGS(&(*rootSig))));

建立的时候 每条shaderrecord里面matID是不一样的 在hitshader里面

uint materialID = MaterialID;
uint triangleID = PrimitiveIndex();

RayTraceMeshInfo info = g_meshInfo[materialID];

const uint3 ii = Load3x16BitIndices(info.m_indexOffsetBytes + PrimitiveIndex() * 3 * 2);
const float2 uv0 = GetUVAttribute(info.m_uvAttributeOffsetBytes + ii.x * info.m_attributeStrideBytes);
const float2 uv1 = GetUVAttribute(info.m_uvAttributeOffsetBytes + ii.y * info.m_attributeStrideBytes);
const float2 uv2 = GetUVAttribute(info.m_uvAttributeOffsetBytes + ii.z * info.m_attributeStrideBytes);

就可以用这种方式matID拿到具体数据

==================

hit之后的顶点信息有两种方式可以获取 gloable /local sig

gloable的方式 需要传matID每次用这个ID从大的buffer(vb包含所有mesh)作为偏移拿到具体 pos uv normal tangent信息

另一种local的方式 每个hit shader传 自己的vb数据(initialze的时候每块mesh来处理 生成不同的 shader和vb)作为cb传入 用hit时的primitiveIndex拿到相应数据

这样hit的mat也都是每块mesh不一样的了

==========

这是些intric val

Values \ shaders

Ray dispatch system values:

uint2 DispatchRaysIndex()

uint2 DispatchRaysDimensions()

Ray system values:

float3 WorldRayOrigin()

float3 WorldRayDirection()

float RayTMin()

float RayTCurrent()

uint RayFlags()

Primitive/object space system values:

uint InstanceIndex()

uint InstanceID()

uint PrimitiveIndex()

float3 ObjectRayOrigin()

float3 ObjectRayDirection()

float3x4 ObjectToWorld()

float3x4 WorldToObject()

Hit specific system values:

uint HitKind()

=========================

draw() rastization

dispatch() compute

dispatchRays() raytracing

invoke

DXR的更多相关文章

  1. 让IIS7.0.0.0支持 .iso .7z .torrent .apk等文件下载的设置方法

    IIS默认支持哪些MIME类型呢,我们可以这样查看:打开IIS管理器(计算机--管理--服务和应用程序--Internet信息服务(IIS)管理器:或者Win+R,输入inetmgr,Enter),在 ...

  2. IIS配置MP3/MP4/OGG/flv等资源文件访问

    配置过程参考:http://www.cnblogs.com/EasonJim/p/4752399.html 以下包含了mp4的mime类型: 323 text/h323 acx application ...

  3. 【积累篇:他山之石,把玉攻】Mime 类型列表

    按照内容类型排列的 Mime 类型列表 类型/子类型 扩展名 application/envoy evy application/fractals fif application/futurespla ...

  4. Socket实现仿QQ聊天(可部署于广域网)附源码(4)-加入数据库系统搭建完成

    1.前言 这是本系列的第四篇文章,上一篇我们讲到实现了客户端对客户端的抖屏与收发各种类型文件,本篇文章我们加入SQLServer数据库实现登录与好友的添加等功能,并对界面做了美化处理.向往常一样我会把 ...

  5. Android应用中实现系统“分享”接口

    在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中. 第一步:在Manifest.x ...

  6. ios UIWebView 在开发中加载文件

    UIWebView 在实际应用中加载文件的时候,有两种情况, 1. 实行在线预览 , 2. 下载到本地,再查看 如果是第一种情况: NSURL *url = [NSURL URLWithString: ...

  7. gnuplot: 一种更为简洁的曲线,柱状图绘图软件

    gnuplot: 一种更为简洁的曲线,柱状图绘图软件 gnuplot: 一种更为简洁的曲线,柱状图绘图软件 Zhong Xiewei Wed Jun 25 gnuplot简单介绍 关于gnuplot的 ...

  8. Moon.Orm性能报告

    以下为有网友公司的评估测试及使用规范 大家可以下载word看看 http://pan.baidu.com/s/1hquvRuc 一.和ADO.NET进行的压力测试 说明:2000并发用户,此图为一网友 ...

  9. Lind.DDD.Utils.HttpHelper里静态对象引出的Http超时问题

    回到目录 Lind.DDD.Utils.HttpHelper组件主要实现了对HTTP的各种操作,如Get,Post,Put和Delete,它属于最纯粹的操作,大叔把它封装的目的主要为了实现与API安全 ...

随机推荐

  1. 三:基于Storm的实时处理大数据的平台架构设计

    一:元数据管理器==>元数据管理器是系统平台的“大脑”,在任务调度中有着重要的作用[1]什么是元数据?--->中介数据,用于描述数据属性的数据.--->具体类型:描述数据结构,数据的 ...

  2. window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)

    关键区域(CriticalSection) 临界区是为了确保同一个代码片段在同一时间只能被一个线程访问,与原子锁不同的是临界区是多条指令的锁定,而原子锁仅仅对单条操作指令有效;临界区和原子锁只能控制同 ...

  3. 【JBPM4】判断节点decision 方法1

    JPDL <?xml version="1.0" encoding="UTF-8"?> <process key="decision ...

  4. AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

    #2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...

  5. 服务器迁移到 Windows Servec 2008 R2 64 bit 和IIS 7问题记录

    近期公司把网站迁移到了新的环境,windows service 2008 64 bit 和IIS 7,问题有点多,对系统使用影响很多,也困扰了我几个星期,现在记录一些主要的注意点 1.组件权限 系统使 ...

  6. EF6 Working with Proxies ProxyCreationEnabled

    When creating instances of POCO entity types, the Entity Framework often creates instances of a dyna ...

  7. python 正则表达式匹配中文(转)

    网上的一篇文章,做了整理,作者已无从考证,谢谢了 s=""" en: Regular expression is a powerful tool for manipula ...

  8. HDU 6463.超级无敌简单题-卡边界的暴力 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    超级无敌简单题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. (7) go 函数

    1.格式 调用 2.包 (1)包 本质 文件夹.每一个文件都必须属于一个包 (2)给包取别名 (3)函数的首字母大小,决定是否能被外包访问 (3) 3.多返回值 4.递归 5.基本数据类型和数组都是拷 ...

  10. HDU3487 Play With Chain [Splay]

    题目传送门 题目描述 Problem Description YaoYao is fond of playing his chains. He has a chain containing n dia ...