色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    4990

    瀏覽量

    103105
  • vr
    vr
    +關注

    關注

    34

    文章

    9640

    瀏覽量

    150307
收藏 人收藏

    評論

    相關推薦

    DS320PR810-SMP-EVM用戶指南

    電子發燒友網站提供《DS320PR810-SMP-EVM用戶指南.pdf》資料免費下載
    發表于 11-26 16:15 ?0次下載
    DS320PR810-<b class='flag-5'>SMP</b>-EVM用戶指南

    NVIDIA推出適用于網絡安全的NIM Blueprint

    德勤使用適用于容器安全的 NVIDIA NIM Agent Blueprint 幫助企業利用開源軟件構建安全的 AI。
    的頭像 發表于 11-20 09:58 ?229次閱讀

    MSP430? USB HID Windows API編程人員指南

    電子發燒友網站提供《MSP430? USB HID Windows API編程人員指南.pdf》資料免費下載
    發表于 09-05 09:40 ?0次下載
    MSP430? USB HID Windows <b class='flag-5'>API</b><b class='flag-5'>編程</b>人員指南

    API :軟件程序間溝通的橋梁

    什么是API呢?我們又是怎樣利用API實現數據交付的呢? 從理論上來說,API就是應用程序編程接口。它是一組預定義的函數或方法,用于描述軟件
    的頭像 發表于 08-27 15:54 ?265次閱讀

    NVIDIA推出用于支持在全新GeForce RTX AI筆記本電腦上運行的AI助手及數字人

    NVIDIA 宣布推出全新 NVIDIA RTX?技術,用于支持在全新 GeForce RTX AI 筆記本電腦上運行的 AI 助手及數字人。 ? NVIDIA 推出?G-
    的頭像 發表于 06-04 10:19 ?787次閱讀

    借助NVIDIA DOCA 2.7增強AI 云數據中心和NVIDIA Spectrum-X

    NVIDIA DOCA 加速框架為開發者提供了豐富的庫、驅動和 API,以便為 NVIDIA BlueField DPU 和 SuperNIC 創建高性能的應用程序和服務。
    的頭像 發表于 05-29 09:22 ?500次閱讀

    NVIDIA DPU編程入門開課儀式在澳門科技大學成功舉辦

    5 月 24 日,NVIDIA DPU 編程入門開課儀式在澳門科技大學成功舉辦。作為首個在中國開設 NVIDIA DPU 編程相關課程的高校,來自澳門科技大學不同院系的師生共同見證了本
    的頭像 發表于 05-28 09:40 ?398次閱讀

    NVIDIA Omniverse使用Apple Vision Pro拓展世界

    在最新一屆的GTC大會上,NVIDIA宣布了一項革命性的技術突破——全新Omniverse Cloud API的推出。這一創新性的應用編程接口,使得開發者能夠將交互式的工業數字孿生無縫流式傳輸至Apple Vision Pro中
    的頭像 發表于 03-27 10:36 ?416次閱讀

    NVIDIA宣布推出基于Omniverse Cloud API構建的全新軟件框架

    NVIDIA 在 GTC 大會上宣布推出基于 Omniverse Cloud API(應用編程接口)構建的全新軟件框架。
    的頭像 發表于 03-25 09:09 ?542次閱讀

    全新NVIDIA Omniverse Cloud API有何亮點?

    NVIDIA Omniverse Cloud API 使開發者能夠將 Omniverse 技術集成到其設計與仿真工具和工作流中。
    的頭像 發表于 03-20 13:42 ?476次閱讀

    NVIDIA宣布將以API形式提供Omniverse? Cloud

    NVIDIA Omniverse Cloud API 使開發者能夠將 Omniverse 技術集成到其設計與仿真工具和工作流中。
    的頭像 發表于 03-20 09:45 ?468次閱讀

    NVIDIA發布Omniverse Cloud API,為眾多工業數字孿生軟件工具提供助力

    —— NVIDIA于今日宣布將以API形式提供Omniverse? Cloud,將該全球領先的工業數字孿生應用和工作流創建平臺的覆蓋范圍擴展至整個軟件制造商生態系統。 ? 借助五
    發表于 03-19 09:40 ?495次閱讀
    <b class='flag-5'>NVIDIA</b>發布Omniverse Cloud <b class='flag-5'>API</b>,為眾多工業數字孿生軟件工具提供助力

    ServiceNow與NVIDIA合作推出電信專用生成式AI解決方案以提升服務

    基于 Now 平臺構建的 Now Assist 電信服務管理軟件充分使用 NVIDIA AI 技術提高工作效率、加快解決問題速度并縮短價值實現時間。
    的頭像 發表于 02-29 10:28 ?599次閱讀

    基于NVIDIA DOCA 2.6實現高性能和安全的AI云設計

    作為專為 NVIDIA? BlueField? 網絡平臺而設計的數據中心基礎設施軟件框架,NVIDIA? DOCA? 使廣大開發者能夠利用其行業標準 APINVIDIA Blue
    的頭像 發表于 02-23 10:02 ?477次閱讀

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 剛剛 GA,旨在改進將集群服務暴露給外部的過程。這其中包括一套更標準、更強大的 API資源,用于管理已暴露的服務。在這篇文章中,我將介紹 Gateway
    的頭像 發表于 01-12 11:32 ?896次閱讀
    Kubernetes Gateway <b class='flag-5'>API</b>攻略教程
    主站蜘蛛池模板: 麻豆AV无码蜜臀AV色哟| 国产午夜精品福利久久| 第一次破女视频出血视频| 曰本女人牲交视频免费| 国产精品青青草原app大全| 人妻免费视频公开上传| 99这里只有是精品2| 久青草国产在线视频亚瑟影视| 亚洲视频成人| 精品国产成a人在线观看| 性肥胖BWBWBW| 国产精品伊人| 小sao货ji巴cao死你视频| 国产精品第九页| 天美麻豆成人AV精品视频| 国产成人a一在线观看| 偷柏自拍亚洲综合在线| 国产精品A8198V久久A片| 无码日本亚洲一区久久精品| 国产精品人成在线播放新网站| 午夜伦理在线观看| 国产永久免费高清在线观看| 亚洲人成网站7777视频| 久久青草热热在线精品| 91久久精品一区二区三区| 免费视频国产| 成人在线观看视频免费| 双性精跪趴灌满h室友4p| 国产区在线不卡视频观看| 亚洲精品色情APP在线下载观看| 和姐姐做插得很深| 永久adc视频| 奶头被客人吸得又红又肿| younv 学生国产在线视频| 熟女人妻久久精品AV天堂| 国产欧美另类久久久品| 亚洲欧美中文日韩视频| 伦理片飘花免费影院| h片下载地址| 无码一区二区在线欧洲| 寂寞护士中文字幕 mp4|