發表文章

目前顯示的是 6月, 2019的文章

UE4 大圖輸出 (HighResScreenshot)

導讀 如果你對「像素」、「印刷尺寸」、「DPI」之間的關係還不夠熟悉可先參考以下連結 數位影像、像素、影像大小、解析度、列印尺寸 照片印刷不失真,你真的會 DPI 換算嗎? 在UE4中欲擷圖供大圖輸出 在UE4中可透過High Resolution Screenshot功能來取得大像素圖檔,但在實際使用上有一些限制與瓶頸,本篇文章將詳細介紹細節與測試案例分享 一、計算目標像素大小 假設設定目標印刷尺寸為 140 x 220 cm,350 DPI,則得出欲取得像素尺寸為 19291 x 30315 px 計算像素大小 方法一,透過影像處理軟體的影像尺寸來做換算 方法二, 線上轉算工具 二、高解析擷圖 (解析限制與操作瓶頸) UE4編輯器內建高解析擷圖工具倍率最高限制為10倍 擷圖期間若電腦記憶體不足,則會程序崩潰 擷圖像素尺寸過大會直接顯示系統不支援 // 編輯器內建擷圖工具,基準1倍是指當前viewport大小 // 編輯器擷圖工具最高倍率限制應可修改引擎原始碼來突破限制 // 此處系統不支援應是指顯卡渲染架構限制 UE4 AnserHub: HighResShot multiplier too large 「the screenshot is being rendered to a texture, not just a memory buffer, so it will be limited by the maximum size of a texture in the graphics pipeline.」 「In Direct3D 11, it looks like it's set (by DirectX) at the max size of 16384」 三、測試與案例分享 若記憶體為16GB,則最大操作上限約為 viewport size: Full HD x 8倍 記憶體使用48GB,可支援 viewport size: Full HD x 10倍 取得像素約 6000 x 12000 px 記憶體使用48GB,使用4K螢幕,倍率設定4.8倍 取得像素約 10000 x 16000 px 擴展 viewport大小 方法一,UE4 editor -> edi

AR技術應用 簡易分類

1) 基本型 主要架構為攝影機畫面融合虛擬畫面,細分為攝影機畫面(背景)+虛擬畫面(前景)、攝影機畫面(前景)+虛擬畫面(背景)兩種,此類型限制為固定攝影機視角 關鍵字:AR、圖片去背、影片去背、綠幕合成 https://www.youtube.com/watch?v=KUjSZBbGUlo 2)進階型 - 虛擬畫面可被實景所遮蔽 可透過事先定義之遮罩來實現 關鍵字:AR、遮蔽 https://www.youtube.com/watch?v=3KoxtAmvaoQ 3)進階型 - 攝影機可自由控制 須外加輔助標記物或空間定位裝置,細分兩種虛擬物件添加實體標記、在攝影機上加裝空間定位追蹤 關鍵字:AR、追蹤(track) https://www.youtube.com/watch?v=Gp2L_j1TTII https://www.youtube.com/watch?v=8v78vSaQH8U 4)商務型 - 實景光照能反映至虛擬物件 製作難度略高,需相關專業設備(投影牆、光照資訊擷取設備),軟體同步也較複雜(視角與即時光照變化) 關鍵字:AR、即時合成 https://www.unrealengine.com/zh-CN/spotlights/unreal-powers-on-the-fly-compositing-with-handheld-camera

UE4使用TcpSocket發生畫面凍結問題 (socket block)

情況說明: 在UE4中透過winsock來與客戶傳輸資料,保持連線且雙向傳輸(雙方都有傳送與接收),對方在長時間閒置下會停止傳送與接收,我這邊仍持續傳送與接收,最終引發socket block,又因在這個案例中我僅socket->recv()有做thread,send()則無,所以最後ue4 main thread被send()卡住,造成UE4畫面凍結。 解法: socket->SetNonBlocking(); // 將此socket設定為非阻塞模式,預設為阻塞模式 ue4 socket實現參考 socket block ------------------------------------- 延伸閱讀 Online Subsystem模組為UE4提供一些用於跟Steam, Xbox Live, Facebook...等外部網路服務連接的接口。而winsock也被封裝在內 FSocket* socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM) ->CreateSocket(NAME_Stream, TEXT("default"), false); // 這裡的 "PLATFORM_SOCKETSUBSYSTEM" 會判定你使用的作業系統 // 這邊的 "NAME_Stream" 則決定選用哪種的socket type 這邊使用 "NAME_Stream" 最終追蹤到 c:\Program Files (x86)\Windows Kits\8.1\Include\um\winsock.h,內容實現則在WINSOCK.DLL裡 // windows裡還有分 winsock.h 跟 WinSock2.h 就不在這討論 Online Subsystem UE4网络底层概览 Facebook Online Subsystem WinSock TCP keepalive的机理及使用