主頁 >  其他 > GraphicsLab Project之Diffuse Irradiance Environment Map

GraphicsLab Project之Diffuse Irradiance Environment Map

2020-09-12 12:50:12 其他

 

作者:i_dovelemon

日期:2020-01-04

主題:Rendering Equation,Irradiance Environment Map,Spherical Harmonic

 

ChangeLog-2020/01/11: 添加 Light Probe Blend 相關描述

 

引言

        在實時圖形渲染中,Global Illumination 是圣杯級的效果,為了實作這個效果,前輩們開發了很多的技術,但是這些技術大都只能用于靜態物體上,對于動態的物體卻不能很好的支持,所以,為了讓動態的物體也有一點 GI 的效果,開發出了一系列的技術,今天,我們就來介紹其中一種技術:Diffuse Irradiance Environment Map,在游戲開發領域,一般稱之為 Light Probe(注:當然 Light Probe 能夠實作更多的效果,Diffuse 的 GI 是其中一種),

        Diffuse Irradiance Environment Map 是基于 Environment Map 來實作的,所以,它不會考慮陰影和模型本身的光照影響,同時,我們也只探討光照中的 Diffuse 部分,即 Lambert BRDF 部分,

        文章中會存在大量的渲染相關的術語,諸如 irradiance,radiance,solid angle 等等,我們假設你已經了解了這些基礎性的概念知識,如果不是,PBRT [文獻1] 是一個很好的參考資料,

        本文將主要從兩個方面來講述:一個是傳統的計算 Diffuse Irradiance Environment Map 的方法,我們稱之為 Brute force;另外一種是基于 Spherical Harmonic 的方法,

 

背景知識

        我們回顧下渲染方程,可以知道一個點在半球范圍里面受到的 irradiance 為:

$E(\vec{n})=\int_{\Omega(\vec{n})}^{ }L(\vec{w})(\vec{n}\cdot\vec{w})d\vec{w} \ \ \ \ \ \ \ \ (1)$

也就是說,對于一個固定的 Environment Map (即 $L(\vec{w})$ 相同)來說,irradiance 只和 normal 有關,所以,我們可以通過預計算,將 Environment Map 對應的 Irradiance Environment Map 保存為一個和 normal 相映射的形式,然后通過頂點的 normal 來獲取對應的 irradiance 資訊,獲取到 irradiance 資訊之后,帶入下面的公式,就能夠得到最終需要顯示的顏色值:

$B(\vec{p},\vec{n})=f(\vec{p})E(\vec{n}) \ \ \ \ \ \ \ \ (2)$

其中 $f(\vec{p})$ 表示的是 Diffuse 的 BRDF,

 

BruteForce 方法

        公式(1)中計算 irradiance 的方法,是一個在半球范圍里面積分的形式,這種方式不存在決議解,沒有辦法直接去計算得到,但是,由于光斬訓境是通過 Environment Map 來表達的,我們可以將公式(1)轉化為離散的形態,如下公式所示:

$E(\vec{n})=\sum_{i=0}^{N-1}L(\vec{w})(\vec{n}\cdot\vec{w})d(\vec{w})\ \ \ \ \ \ \ \ (3)$

其中,N 表示的是整張 Environment Map 上的所有像素的數量;$L(\vec{w})$ 表示的是在 $\vec{w}$ 方向上的 radiance;$d(\vec{w})$ 表示的是在 $\vec{w}$ 方向上像素的 solid angle,

        這樣,我們就有了一個方法來實際計算一個 normal 方向上的 irradiance 的值了,

        我們知道了如何計算一個 normal 對應的 irradiance 的值,那么這個值該怎么保存了?很明顯的,我們可以利用另外一張 Cubemap 來保存各個 normal 計算出來的對應的 irradiance 的值,而這個新的 Cubemap 就是 Diffuse Environment Irradiance Map,以下是整個程序的偽代碼:

for pixel_iem in IrradianceEnvironmentMap
        n = GetNormal(pixel_iem)
        irradiance = 0
        for pixel in EnvironmentMap
                L = GetRadiance(pixel)
                w = GetRadianceDir(pixel)
                dw = GetTexelSolidAngle(pixel)
                irradiance += L * max(0, dot(n,w)) * dw
        pixel_iem = irradiance

 

Cubemap Texel Solid Angle

  上面的代碼中,唯一可能比較難計算的是:GetTexelSolidAngle,[文獻2] 中詳細的解釋了如何定義這個函式,以及該函式背后的數學原理,這里給出實際的代碼,不再贅述:

    private static float AreaElement(float x, float y)
    {
        return Mathf.Atan2(x * y, Mathf.Sqrt(x * x + y * y + 1.0f));
    }

    private static float TexelCoordSolidAngle(float x, float y, int size)
    {
        // Scale up to [-1,1] range (inclusive), offset by 0.5 to point to texel center
        float u = 2.0f * (x + 0.5f) / size - 1.0f;
        float v = 2.0f * (y + 0.5f) / size - 1.0f;

        float invRes = 1.0f / size;

        // Project area for this texel
        float x0 = u - invRes;
        float y0 = v - invRes;
        float x1 = u + invRes;
        float y1 = v + invRes;
        return AreaElement(x0, y0) - AreaElement(x0, y1) - AreaElement(x1, y0) + AreaElement(x1, y1);
    }

        我們知道,solid angle 在整個球上的積分值為 $4\pi$,前面我們將公式(1)轉化成了離散的形式,這樣就導致所有像素的 solid angle 的總和與 $4\pi$ 存在一定的誤差,所以需要進行修正,修正之后的偽代碼如下所示:

for pixel_iem in IrradianceEnvironmentMap
        n = GetNormal(pixel_iem)
        irradiance = 0
        totalSolidAngle = 0
        for pixel in EnvironmentMap
                L = GetRadiance(pixel)
                w = GetRadianceDir(pixel)
                dw = GetTexelSolidAngle(pixel)
                irradiance += L * max(0, dot(n,w)) * dw
                totalSolidAngle += dw
        pixel_iem = irradiance * 4 * PI / totalSolidAngle

        好了,至此我們就得到了一張 Diffuse Irradiance Environment Map,在渲染的時候,我們只要通過像素的 normal 來采樣 Irradiance Environment Map 就可以得到對應的 irradiance,然后帶入公式(2)中,得到最終需要顯示的顏色值,

 

To PI or not to PI?

        這里有一個容易引起困惑的地方,我們知道,Lambert 光照模型的 BRDF 如下所示:

$f = \frac{c_{diff}}{\pi}\ \ \ \ \ \ \ \ (4)$

而有游戲開發經驗的同學就知道,在游戲里面我們定義 Diffuse 的光照模型如下所示:

$B=c_{diff}*c_{light}*max(0,dot(\vec{n},\vec{w}))\ \ \ \ \ \ \ \ (5)$

這里卻沒有 $\pi$ 相關的值,這是因為在傳統的游戲里面,我們定義的 $c_{light}$ 并不是以光學輻射度的單位來定義的,而是以一種對美術更加友好的定義方式:當一個純白的 Lambert 表面被一束平行于表面 normal 的光所照射時所呈現的顏色為 $c_{light}$,也就是說,傳統游戲開發中定義的 $c_{light}$,實際上是真實光學輻射度單位輸入除以 $\pi$ 之后的結果,所以公式(5)中就不存在 $\pi$,

       說這么多的意思是,我們定義 Environment Map 是以真實的輻射度單位來保存的,也就是說在計算最終顏色的時候,我們需要自己除以 $\pi$ 來保證結果的正確性,即將公式(4)帶入公式(2)中計算最終的顏色值,即:

$B=\frac{c_{diff}}{\pi}E(\vec{n})\ \ \ \ \ \ \ \ (6)$

這里為了簡化 shader 中的計算,我們將 $\pi$ 的計算放在了 Diffuse Irradiance Environment Map 里,即:

for pixel_iem in IrradianceEnvironmentMap
        n = GetNormal(pixel_iem)
        irradiance = 0
        totalSolidAngle = 0
        for pixel in EnvironmentMap
                L = GetRadiance(pixel)
                w = GetRadianceDir(pixel)
                dw = GetTexelSolidAngle(pixel)
                irradiance += L * max(0, dot(n,w)) * dw
                totalSolidAngle += dw
        pixel_iem = irradiance * 4 * PI / totalSolidAngle
        pixel_iem = pixel_iem / PI

關于 $\pi$ 的詳細討論可以參考[文獻3],

 

結果 

        以下是一些通過 BruteForce 方法計算出來的 Diffuse Irradiance Environment Map 和原始 Environment Map 的對比結果圖,Diffuse Irradiance Environment Map 大小是 32x32:

 

 

 

Spherical Harmonic 方法

        Spherical Harmonic 是信號處理里面的一種變換方法,和 Fourier 變換相似,都是將信號轉化到頻域中去,以此來更加精簡的表達原始復雜的信號,不同的是,Spherical Harmonic 更加適合用來處理球面相關的信號,而渲染相關的問題,都是在一個球面范圍里面進行,所以選擇使用 SH 的方法,關于 SH 的描述,[文獻4] 講解的非常詳細,這里就不再贅述,神奇的地方在于,BruteForce 的方法得到的是最終的 Diffuse Irradiance Environment Map,而 SH 的方法得到的是 SH 系數(一般是9個系數),然后在實際渲染的時候,我們根據這9個系數,重建原始的信號,得到對應的 irradiance,

 

Prefilter

        根據[文獻5]中的描述,我們知道如果使用 SH coefficient 的表示方法來編碼 Environment Map 的話,將使用如下的公式:

$L(\theta,\phi)=\sum_{l,m}^{ }L_{lm}Y_{lm}(\theta,\phi)\ \ \ \ \ \ \ \ (7)$

而同樣的,使用 SH 編碼 Irradiance Environment Map 的話,將使用如下的公式:

$E(\theta,\phi)=\sum_{l,m}^{ }E_{lm}Y_{lm}(\theta,\phi)\ \ \ \ \ \ \ \ (8)$

同時定義:

$A=(\vec{n}\cdot\vec{w})$

$A(\theta)=\sum_l^{ }A_lY_{l0}(\theta)\ \ \ \ \ \ \ \ (9)$

根據上面的定義,我們得到:

$E_{lm}=\sqrt{\frac{4\pi}{2l+1}}A_lL_{lm}\ \ \ \ \ \ \ \ (10)$

引入新的變數:

$\hat{A}_l=\sqrt{\frac{4\pi}{2l+1}}A_l\ \ \ \ \ \ \ \ (11)$

將公式(9)(10)(11)帶入公式(8),得到:

$E(\theta,\phi)=\sum_{l,m}^{ }\hat{A}_lL_{lm}Y_{lm}(\theta,\phi)\ \ \ \ \ \ \ \ (12)$

公式(12)中,$\hat{A}_l$是可以預先計算出來的,$Y_{lm}(\theta,\phi)$ 通過帶入 normal,也能夠計算出來,只有 $L_{lm}$ 是未知的,所以,我們 Prefilter 操作的目的就是計算出 $L_{lm}$ 的值,

        [文獻5]中講述了我們只需要3階的 SH 系數,就能夠很好的表達信號,所以我們只需要計算出來 $l <= 2$ 的 SH 系數即可,

        根據文獻[4]中的描述,計算 SH 系數的方式就是將信號投影到對于的基向量上去即可,即:

$L_{lm}=\int_{\Omega}^{ }L(\vec{w})Y_{lm}(\vec{w})d(\vec{w})\ \ \ \ \ \ \ \ (13)$

同樣的,我們將這個積分形式的方程,轉化為離散的形式[文獻6],如下所示:

$L_{lm}=\sum_{i=0}^{N-1}L(\vec{w})Y_{lm}(\vec{w})d(\vec{w})\ \ \ \ \ \ \ \ (14)$

這樣,我們就能夠通過計算,得到3階球諧的9個系數,但是我們知道光的單位是有RGB三個部分組成,每一個部分可以單獨的進行 SH 系數的求解,所以最終的結果是9個RGB系數,以下是求解這些系數的偽代碼:

foreach sh_coefficient
        sh_coefficient = 0
        totalSolidAngle = 0
        for pixel in EnvironmentMap
                L = GetRadiance(pixel)
                sh = GetSHBais(pixel)
                dw = GetTexelSolidAngle(pixel)
                sh_coefficient += L * sh * dw
                totalSolidAngle += dw
        sh_coefficient = sh_coefficient * 4 * PI / totalSolidAngle

計算程序十分簡單,唯一需要注意的點是GetSHBais 函式的實作,這個函式的定義可以通過預先計算得到,如下所示[文獻5]:

 

至此,Prefilter 的作業就完成了, 

 

Rendering

        通過公式(12),我們在知道了 SH 系數的情況下,就可以重建原始的 irradiance 信號,由于公式(12)中只有 $L_{lm}$ 是未知的,其他兩個部分都是可以通過預計算得到,所以合并預計算的部分,我們得到根據 SH 系數重建信號的公式[文獻5]:

 

         這樣,在知道了 irradiance 的情況下,帶入到公式(2)中,得到:

$B=\frac{c_{diff}}{\pi}E\ \ \ \ \ \ \ \ (15)$

 

結果

        以下是通過 SH 的方法得到的 Diffuse Irradiance Environment Map 和原始 Environment Map 的對比:

 

 

 

Light Probe Blend

        上面的描述中,我們都是從一個特定的點去繪制環境貼圖,然后以此環境貼圖為周圍光照的 radiance 描述來構建 light probe,對于 reflection environment map 來說,我們可以通過簡單的數學計算,就能夠得到一個 localized 的效果(見文獻[8]),但是對于 light probe 來說,由于需要在半球范圍里面進行積分運算,無法使用文獻[8]中描述的方式實作 localized 的效果,但是,我們可以通過對兩張在不同的點生成的 light probe 進行插值,以此來構建他們之間某個點的 light probe,從而實作一定程度上的 localized 的效果,

        對于 SH 表達的 light probe 來說,在兩個 light probe 之間進行插值就是簡單對 SH coefficient 進行插值即可(見文獻[9]):

 

        當然在實際的游戲開發中,你不可能只對兩個 light probe 進行插值,為了較好的表達整個場景的效果,我們需要在場景中擺放很多個 light probe,然后根據被渲染物體所在的位置選擇一個或多個 light probe,根據一定的權重進行插值,這部分的知識也十分復雜,可以參考文獻[9]中的具體描述,文獻[9]描述了常見的系統設計方案,以及它所存在的問題,同時給出了 Unity 對此進行的改進和它所使用的方案,感興趣的讀者可以去了解,

 

兩種方法對比

        我們假設原始 Environment Map 的尺寸是 NxNx6,而 BruteForce 方法計算得到的 Diffuse Irradiance Environment Map 的尺寸為 MxMx6,那么對于 BruteForce 的方法來說,就是一個 O(NxNxMxM) 的操作,而對于 SH 方法來說,它的計算時間為 O(9xNxN),兩個方法在Prefilter上面,SH 的速度大大提高,同時,對于 BruteForce 方法來說,得到的結果是一張 Cubemap,在渲染的時候需要進行采樣,而 SH 的方法則是通過一些簡單的計算得到最終的結果,

        以下是兩種方式得到的 Diffuse Irradiance Environment Map 的對比:

 

 可以看到,通過 SH 方式得到的結果和 BruteForce 的方法得到的結果誤差非常小,

 

結論

        如果在實際使用程序中,你需要使用 Diffuse Irradiance Environment Map,也是建議通過先求 SH 系數,然后重建 Diffuse Irradiance Environment Map,這樣的方法比 BruteForce 來計算得到 Diffuse Irradiance Environment Map 的速度要快的多,

        當然除了這里提到的方法,還有很多其他的方法來計算 Diffuse Irradiance Environment Map,比如[文獻7]中,使用 Rieman 積分的方式,加速 BruteForce 方法來得到結果,

        這里只是介紹了基礎的知識,在實際專案開發程序中還需要處理諸多的問題,比如:Light Probe Auto Layout,Light Probe Blend 等等復雜的問題,后面有機會會專門講解這方面的知識,

        本文的配套代碼可以在這里獲取得到:https://github.com/idovelemon/UnityProj/tree/62eff639347645f380d651dd80b8720010f6097b/IrradianceEnvironmentMap,值得注意的是,學術界對球面坐標系的定義是 Z 軸朝上,而在 Unity 里面是 Y 軸朝上,實際代碼實作的時候需要轉化下方向,

 

參考文獻

[1] Physically Based Rendering : From Theory to Implementation

[2] Cubemap Texel Solid Angle

[3] PI or not to PI in game lighting equation

[4] Spherical Harmonic Lighting:The Gritty Details

[5] An Efficient Representation for Irradiance Environment Maps

[6] Real-Time Computation of Dynamics Irradiance Environment Maps

[7] GraphicsLab Project 之 IBL - Diffuse 光照

[8] Image-based Lighting

[9] Light Probe Interpolation using Tetrahedral Tessellations

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14238.html

標籤:其他

上一篇:在MATLAB R2018b中配置VLFeat

下一篇:Halcon blob分析基本處理步驟

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more