0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用于VR编程的NVIDIA SMP Assist API

设计idea 来源:互联网 作者:佚名 2018-05-07 10:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

NVIDIA SMP(同时多投影)辅助NVAPI驱动程序扩展是一种将多分辨率着色和镜头匹配着色集成到VR应用程序中的简单方法。它将大量的状态设置和API调用封装到简化的API中,从而大大降低了将NVIDIAVRWorks集成到应用程序中的复杂性具体来说,SMP Assist驱动程序处理创建和管理快速几何着色器,视口状态和剪刀状态,而不是在应用程序中手动管理这些状态。

简化多分辨率和镜头匹配阴影

在VR头戴式耳机中,用户通常通过引起枕形失真的透镜来观看显示器。虚拟现实应用渲染桶形失真图像以反转镜头本身的枕形失真,从而在头戴式耳机中形成几何上正确的场景。桶形失真图像的周边区域显着收缩。NVIDIA VRWorks SDK包含多分辨率着色镜头匹配着色等功能,允许应用程序开发人员利用桶形失真图像的非线性优势,减少渲染帧时所需的像素着色工作负载,同时保持视觉质量。

如图1所示,多分辨率着色(MRS)使用多个视口与剪刀矩形组合,以创建多分辨率投影。每个视口内的分辨率保持不变,而分辨率在不同的视口中变化。它们的排列方式可以使视口一起呈现场景的一个复杂的无缝投影。中央视口通常具有比周边视口更高的分辨率,从而更好地匹配桶失真图像并节省不必要的像素着色工作量。

图1:多分辨率阴影

镜头匹配阴影(LMS)使用多个视口结合剪形矩形和线性变换来创建镜头匹配投影,如图2所示。在镜头匹配投影中,三角形顶点在被下列光栅化之前进行变换转型:

w'= w + Ax + By

从概念上讲,这会在透视投影之前缩放剪辑空间中顶点的“w”坐标。顶点的剪辑空间“w”坐标可以作为“x”和“y”坐标的函数来偏移,这导致顶点被拉向视口的中心,其“x”和“y” “坐标是。仔细选择帧的四个象限中的每一个的系数A和B产生类似桶形失真的变形图像。

图2:镜头匹配阴影

这些功能中的每一个都需要应用程序根据所需的效果计算多个视口和剪刀。此外,对于透镜匹配着色,应用程序必须指定系数(上面公式中的A和B)。应用程序必须确保通过在图形管道中设置快速几何着色器(Fast Geometry Shader,FastGS)来正确渲染场景。该着色器通过计算视口掩码来剔除三角形并将其广播到正确的视口。

全新的NVIDIA SMP Assist API实现了驱动程序中的所有这些步骤,并为应用程序提供了简化的API,使MRS和LMS更容易集成到应用程序或游戏引擎中。

NVIDIA SMP Assist API

当前可用于DirectX11应用程序的SMP Assist API为应用程序提供了一个接口,用于指定VR应用程序使用的MRS / LMS配置。基于此配置,驱动程序在内部执行以下任务:

  1. 计算视口和剪刀。

  2. 创建一个FastGS,它将基元选取并投影到正确的视口中,以匹配需要在投影和未投影的坐标空间之间转换的着色器所需的常量缓冲区数据。

  3. 计算镜头匹配阴影系数(如果适用)。

  4. 驱动程序计算并维护各种渲染模式的上述状态 - 单声道,立体声,实例化立体声。(立体和立体渲染模式的计算假定应用程序在并排配置中渲染,即在单个渲染目标上渲染的两个眼图)。

应用程序可以根据实现的易用性与灵活性的折衷来选择协助级别

  • 完整:应用程序通过从预先配置的列表中选择一个配置来指定配置,该列表针对当前可用的VR HMD进行了微调

  • 部分:应用程序通过提供单个配置参数来指定配置,这对于支持新的或预生产VR头戴式显示器可能有用。

  • 最小化:应用程序提供视口和剪刀,API处理相同的设置,而应用程序负责设置FastGS,GS常量缓冲区和LMS系数。

使用SMP Assist非常简单。只要MRS / LMS投影配置发生变化,应用程序就会调用API,最多每帧应该发生一次。然后,应用程序为需要应用MRS / LMS投影的框架部分启用SMP Assist。在随后的绘制调用中,驱动程序选择并设置上面1,2和3中描述的状态的适当版本,从而覆盖应用程序设置的视口和剪刀。禁用SMP Assist时,驱动程序会将其覆盖到原始状态的任何状态恢复为原始状态,并且以下绘制调用将使用通过常规DirectX API设置的状态。

该API还提供了获取内部计算数据的功能。这些数据可用于放大通过MRS / LMS渲染的图像。

图3突出显示了当前由应用程序执行并由SMP Assist API内部化的任务:

SMP辅助API图VRWorks VR图3. SMP Assist API图

使用SMP Assist API

初始化SMP辅助

通过查询所需SMP功能(MRS / LMS)的平台支持,获取指向SMP Assist接口的指针以及使用此接口指针指定所需的配置(rendertarget大小等),可以初始化SMP Assist API。

NV_QUERY_SMP_ASSIST_SUPPORT_PARAMSQuerySMPAssist={0};QuerySMPAssist.version=NV_QUERY_SMP_ASSIST_SUPPORT_PARAMS_VER;QuerySMPAssist.eSMPAssistLevel=NV_SMP_ASSIST_LEVEL_FULL;QuerySMPAssist.eSMPAssistType=NV_SMP_ASSIST_LMS;NvStatus=NvAPI_D3D_QuerySMPAssistSupport(pD3DDevice,&QuerySMPAssist);if(NvStatus!=NVAPI_OK||QuerySMPAssist.bSMPAssistSupported==false){
//查询失败}NV_SMP_ASSIST_INITIALIZE_PARAMSinitParams={0};ID3DNvSMPAssist*pD3DNvSMPAssist=NULL;initParams.version=NV_SMP_ASSIST_INITIALIZE_PARAMS_VER;initParams.eSMPAssistType=NV_SMP_ASSIST_LMS;initParams.eSMPAssistLevel=NV_SMP_ASSIST_LEVEL_FULL;initParams.flags=NV_SMP_ASSIST_FLAGS_DEFAULT;initParams.ppD3DNvSMPAssist=&pD3DNvSMPAssist;NvStatus=NvAPI_D3D_InitializeSMPAssist(pD3DDevice,&initParams);if(NvStatus!=NVAPI_OK||pD3DNvSMPAssist==NULL){
//NvAPI_D3D_InitializeSMPAssist失败}NV_SMP_ASSIST_SETUP_PARAMSsetupParams={0};setupParams.version=NV_SMP_ASSIST_SETUP_PARAMS_VER;setupParams.eLMSConfig=NV_LMS_CONFIG_OCULUSRIFT_CV1_BALANCED;setupParams.resolutionScale=1.0f;setupParams.boundingBox.TopLeftX=0;setupParams.boundingBox.TopLeftY=0;setupParams.boundingBox.Width=rt_width;setupParams.boundingBox.Height=rt_height;setupParams.boundingBox.MinDepth=0.0;setupParams.boundingBox.MaxDepth=1.0;NvStatus=pD3DNvSMPAssist->SetupProjections(pD3DDevice,&setupParams);

返回的SMP Assist接口对象NvAPI_D3D_InitializeSMPAssist是一个单例。对NvAPI_D3D_InitializeSMPAssist的任何后续调用都会返回一个指向同一对象的指针。该对象由驱动程序响应NvAPI_D3D_InitializeSMPAssist应用程序的第一个调用而创建驱动程序在应用程序退出时销毁对象。应用程序不应试图破坏对象。

用SMP辅助渲染

应用程序应该指出在渲染帧时是否要为即将来临的绘图调用启用/禁用SMP功能。因此,API设置适用于所有后续绘制调用的渲染状态(视口,剪刀,FastGS,LMS系数)

NV_SMP_ASSIST_ENABLE_PARAMSenableParams={NV_SMP_ASSIST_ENABLE_PARAMS_VER,NV_SMP_ASSIST_EYE_INDEX_MONO};NV_SMP_ASSIST_DISABLE_PARAMSdisableParams={NV_SMP_ASSIST_DISABLE_PARAMS_VER};而(…){
...
NvStatus=pD3DNvSMPAssist->启用(pD3DContext,&enableParams);
画();//在启用后,投影应用于所有绘图调用
画();
...
NvStatus=pD3DNvSMPAssist->Disable(pD3DContext,&disableParams);
画();//投影不适用于Disable后的任何绘图调用}

获取SMP辅助数据

应用程序调用ID3DNvSMPAssist::GetConstants在初始化期间读取由API计算的数据。这包括用于指定VR渲染模式的视口/剪刀,FastGS常量缓冲区数据,投影大小和可用于展平通过的其他常数缓冲区数据。

NV_SMP_ASSIST_GET_CONSTANTSsmpAssistConstants={0};D3D11_VIEWPORT视口[NV_SMP_ASSIST_MAX_VIEWPORTS];D3D11_RECT剪刀[NV_SMP_ASSIST_MAX_VIEWPORTS];memset(视口,0,NV_SMP_ASSIST_MAX_VIEWPORTS*sizeof(D3D11_VIEWPORT));memset(剪刀,0,NV_SMP_ASSIST_MAX_VIEWPORTS*sizeof(D3D11_RECT));NV_SMP_ASSIST_FASTGSCBDATAfastGSCBData={0};NV_SMP_ASSIST_REMAPCBDATAremapCBData={0};smpAssistConstants.version=NV_SMP_ASSIST_GET_CONSTANTS_VER;smpAssistConstants.pViewports=viewports;smpAssistConstants.pScissors=剪刀;smpAssistConstants.eEyeIndex=NV_SMP_ASSIST_EYE_INDEX_MONO;smpAssistConstants.pFastGSCBData=&fastGSCBData;smpAssistConstants.pRemapCBData=&remapCBData;NvStatus=pD3DNvSMPAssist->GetConstants(&smpAssistConstants);

实例化立体声注意事项

提供眼睛指数

由驱动程序设置的FastGS需要知道当应用程序以实例化立体模式呈现时,当前着色器实例是渲染左眼还是右眼。

VR应用程序必须确保世界空间着色器(Vertex / Hull / Domain)正确地将当前眼图(eyeIndex)传递给FastGS。应用程序还应该通过NvAPI_D3D11_CreateVertexShaderEx/创建最后的世界空间着色器(顶点/域),NvAPI_D3D11_CreateDomainShaderEx并指示眼睛索引变量是NvAPI_Packed_Eye_Index自定义语义。SMP Assist要求眼图索引变量是一个标量。

NvAPI_D3D11_CREATE_VERTEX_SHADER_EXCreateVSExArgs={0};CreateVSExArgs.version=NVAPI_D3D11_CREATEVERTEXSHADEREX_VERSION;CreateVSExArgs.UseWithFastGS=true;CreateVSExArgs.UseSpecificShaderExt=false;CreateVSExArgs.NumCustomSemantics=1;CreateVSExArgs.pCustomSemantics=(NV_CUSTOM_SEMANTIC*)malloc((sizeof(NV_CUSTOM_SEMANTIC))*CreateVSExArgs.NumCustomSemantics);memset(CreateVSExArgs.pCustomSemantics,0,(sizeof(NV_CUSTOM_SEMANTIC))*CreateVSExArgs.NumCustomSemantics);CreateVSExArgs.pCustomSemantics[0].version=NV_CUSTOM_SEMANTIC_VERSION;CreateVSExArgs.pCustomSemantics[0].NVCustomSemanticType=NV_PACKED_EYE_INDEX_SEMANTIC;strcpy_s(&(CreateVSExArgs.pCustomSemantics[0].NVCustomSemanticNameString[0]),NVAPI_LONG_STRING_MAX,“EYE_INDEX”);NvStatus=NvAPI_D3D11_CreateVertexShaderEx(pD3DDevice,pVSBlob->GetBufferPointer(),pVSBlob->GetBufferSize(),NULL,&CreateVSExArgs,&pVertexShaderInstancedStereo);

不要忘记着色器HLSL文件:

结构VS_OUTPUT{
...
uinteyeIndex:EYE_INDEX;};

如果您希望FastGS将当前实例渲染到左眼,请将eyeIndex的LSB设置为0。否则,FastGS将渲染到右眼。

避免着色器修改

实例立体渲染涉及根据在当前着色器实例中呈现的眼睛视图来移位顶点。但是,LMS要求应用程序不执行这种顶点移动。这意味着应用程序可能必须修改顶点着色器,以确保在LMS情况下顶点不会移位。

SMP Assist提供了一个API,UpdateInstancedStereoData可用于撤销应用程序着色器代码执行的顶点移位。该应用程序不需要修改上述LMS特定要求的着色器代码。应用程序只需提供正确的系数给这个API。这些系数将用于实现该公式以逆转由应用程序的着色器代码完成的顶点移动。

考虑以下顶点着色器片段:

VSOutput主(在顶点i_vtx中,在uint中i_instance:SV_InstanceID,...){...
#ifSTEREO_MODE==STEREO_MODE_INSTANCED
uinteyeIndex=i_instance&1;
output.eyeIndex=eyeIndex;
output.posClip=mul(pos,eyeIndex==0?g_matWorldToClip:g_matWorldToClipR);
//将几何图形移动到正确的眼睛
output.posClip.x*=0.5;
floateyeOffsetScale=eyeIndex==0?-0.5:0.5;
output.posClip.x+=eyeOffsetScale*output.posClip.w;
...}

在上面的着色器中完成逆转顶点移动的公式是:

output.posClip.x = (output.posClip.x - eyeOffsetScale * output.posClip.w ) / 0.5 =2.0 * output.posClip.x + (-eyeOffsetScale * 2.0) * output.posClip.w

左眼:

output.posClip.x = 2.0 * output.posClip.x + 1.0 * output.posClip.w = dotproduct( output.posClip, float4(2.0, 0.0, 0.0, 1.0))

右眼:

output.posClip.x = 2.0 * output.posClip.x - 1.0 * output.posClip.w = dotproduct(output.posClip, float4(2.0, 0.0, 0.0, -1.0))

左/右眼视图x分量的方程可以看作顶点位置和大小为4的向量之间的点积。

由SMP Assist实施的等式每个眼睛视图有5个值:具有顶点位置的点积的4个系数和添加到点积的结果的第5个值。

NV_SMP_ASSIST_UPDATE_INSTANCEDSTEREO_DATA_PARAMSinstancedStereoParams={0};instancedStereoParams.version=NV_SMP_ASSIST_UPDATE_INSTANCEDSTEREO_DATA_PARAMS_VER;instancedStereoParams.eSMPAssistType=NV_SMP_ASSIST_LMS;//左眼:pos.x=dotproduct(pos,leftCoeffs)+leftConstinstancedStereoParams.leftCoeffs[0]=2.0f;instancedStereoParams.leftCoeffs[1]=0.0f;instancedStereoParams.leftCoeffs[2]=0.0f;instancedStereoParams.leftCoeffs[3]=1.0f;instancedStereoParams.leftConst=0.0f;//右眼:pos.x=dotproduct(pos,rightCoeffs)+rightConstinstancedStereoParams.rightCoeffs[0]=2.0f;instancedStereoParams.rightCoeffs[1]=0.0f;instancedStereoParams.rightCoeffs[2]=0.0f;instancedStereoParams.rightCoeffs[3]=-1.0f;instancedStereoParams.rightConst=0.0f;status=m_activeSMPAssist->UpdateInstancedStereoData(m_pDevice,&instancedStereoParams);

应用程序应UpdateInstancedStereoData在SMP Assist成功初始化后调用

更容易的VR编程

NVIDIA驱动程序内置的SMP Assist API使开发人员能够更轻松地实现多分辨率着色和镜头匹配着色,这些关键功能使虚拟现实更易于使用和用户友好。如果您目前不是NVIDIA开发人员并想查看VRWorks,注册非常简单 - 只需点击NVIDIA开发者主页上方的“加入”按钮即可SMP Assist API需要NVIDIA显卡驱动程序版本397.31及更高版本。最新的VRWorks Graphics SDK 2.6版本包含一个示例应用程序和编程指南,如果您已经拥有NVIDIA开发人员帐户,则可以通过SMP Assist进行演示。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5496

    浏览量

    109110
  • vr
    vr
    +关注

    关注

    34

    文章

    9692

    浏览量

    156614
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SMP-MAX系列射频连接器技术解析与应用指南

    安装选项配置。2.7GHz时,高达300W以上的高额定功率为射频放大器提供了出色的性能。Molex SMP-MAX和SMP-MAX EVO 50Ω 射频连接器适用于各种电信和网络应用,包括基站、无线电头端、中继器和系统模块。
    的头像 发表于 11-20 15:56 215次阅读

    1688平台获取店铺所有商品列表API接口技术详解

    ​ 在电商开发中,集成1688平台的API是获取店铺商品数据的关键。1688是阿里巴巴旗下的B2B批发平台,其API接口允许开发者通过编程方式访问店铺的商品列表,用于数据分析、库存管理
    的头像 发表于 11-11 14:04 171次阅读
    1688平台获取店铺所有商品列表<b class='flag-5'>API</b>接口技术详解

    教你如何使用API

    一、了解API API(Application Programming Interface)即应用程序编程接口,是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软
    的头像 发表于 11-09 17:48 1041次阅读

    Python调用API教程

    随着互联网技术的发展,API(Application Programming Interface)的应用越来越广泛。API是指一系列预先定义好的接口,用于以标准化的形式、规范的方式、安全高效地完成
    的头像 发表于 11-03 09:15 330次阅读

    教你如何使用API接口获取数据!

    一、了解API API(Application Programming Interface)即应用程序编程接口,是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软
    的头像 发表于 11-03 09:14 343次阅读

    请问什么是API?怎么使用它?

    什么是APIAPI(应用程序编程接口)是一组定义了不同软件组件之间如何通信的规则和协议。它允许不同的应用程序、服务、库和系统通过标准化的方式进行交互,从而实现数据交换和功能共享。API
    的头像 发表于 10-24 11:37 509次阅读

    NVIDIA Omniverse Extension开发秘籍

    NVIDIA Omniverse 是一个模块化平台,使用高级 API 和微服务来构建由 OpenUSD 和 NVIDIA RTX 提供支持的 3D 应用。OpenUSD 功能强大的 3D 框架与
    的头像 发表于 08-22 15:52 3402次阅读
    <b class='flag-5'>NVIDIA</b> Omniverse Extension开发秘籍

    超过175款游戏和应用现已支持NVIDIA DLSS 4

    超过 175 款游戏和应用现已支持 DLSS 4,包括《生化危机:安魂曲》(Resident Evil Requiem)、《影之刃零》(Phantom Blade Zero)等支持光线追踪的大作,升级的 NVIDIA RTX Remix、Project G-Assist
    的头像 发表于 08-20 14:26 1069次阅读

    产品下架与删除API接口

    ​ 在现代电子商务和产品管理系统中,API接口是实现高效操作的核心工具。产品下架与删除API接口允许管理员或系统通过编程方式管理产品状态,确保数据一致性和安全性。本文将逐步介绍这两个API
    的头像 发表于 07-25 14:15 345次阅读
    产品下架与删除<b class='flag-5'>API</b>接口

    产品列表获取API接口详解

    ​ 在现代软件开发中,API(应用程序编程接口)是获取产品列表的核心工具,它允许开发者从远程服务器高效地检索数据。本文将逐步介绍如何设计和使用产品列表获取API接口,包括核心概念、实现步骤、代码示例
    的头像 发表于 07-24 14:29 470次阅读
    产品列表获取<b class='flag-5'>API</b>接口详解

    如何通过 WICED API 读取固件中编程的 BD 地址?

    /Studio-Bluetooth/WICED-Module-Programmer-Download/td-p/290595我想知道如何通过 WICED API 读取固件中编程的 BD 地址
    发表于 07-03 07:49

    NVIDIA Omniverse Kit 107的安装部署步骤

    NVIDIA Omniverse 是一个模块化平台,使用高级 API 和微服务来构建由 OpenUSD 和 NVIDIA RTX 提供支持的 3D 应用。OpenUSD 功能强大的 3D 框架与
    的头像 发表于 03-28 10:37 1156次阅读
    <b class='flag-5'>NVIDIA</b> Omniverse Kit 107的安装部署步骤

    如何使用MCX N ROM API进行内部闪存擦除/编程

    使用 MCX N ROM API 进行内部闪存擦除/编程
    发表于 03-27 07:04

    EE-311:面向Blackfin处理器的VisualDSP闪存编程API

    电子发烧友网站提供《EE-311:面向Blackfin处理器的VisualDSP闪存编程API.pdf》资料免费下载
    发表于 01-07 14:26 0次下载
    EE-311:面向Blackfin处理器的VisualDSP闪存<b class='flag-5'>编程</b>器<b class='flag-5'>API</b>

    SMO与SMP的区别与联系

    SMO(Social Media Optimization,社交媒体优化)和SMP(Social Media Platform,社交媒体平台)是社交媒体领域中两个重要的概念。它们之间既有区别也有联系
    的头像 发表于 01-03 09:17 2476次阅读