2017-08-26 89 views
1

我的問題特別是關於金屬,因爲我不知道如果答案會改變爲另一個API。mipmapped紋理如何採樣?

我相信我至今不解的是這樣的:

  • 一個mipmapped質感已預先計算「細節層次」,其中詳細的較低水平以某種有意義的方式下采樣原始紋理創建。

  • Mipmap級別是指以細節級別遞減的級別,其中0級別是原始紋理,而較高級別是它的兩次冪減少。

  • 大多數GPU實現三線性濾波,它爲每個採樣選取兩個相鄰的mipmap級別,使用雙線性濾波從每個級別採樣,然後線性混合這些採樣。

我不太明白的是如何選擇這些mipmap級別。在金屬標準庫的documentation中,我看到可以採用樣本,可以指定或不指定lod_options類型的實例。我認爲這種說法改變如何紋理貼圖水平的選擇,並有明顯3種lod_options爲2D紋理:

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

不幸的是,文檔不會解釋這些選項的作用。我可以猜測bias()偏差一些自動選擇的細節水平,但那麼偏見value是什麼意思?它的操作規模是什麼?同樣,的lod如何轉換爲離散的mipmap級別?並且,在gradient2d()使用紋理座標的漸變的假設下運行,它如何使用該漸變選擇mipmap級別?

更重要的是,如果我省略了lod_options,那麼如何選擇mipmap級別呢?這是否根據正在執行的功能類型而有所不同?

而且,如果sample()函數的默認no-lod-options指定的操作是做類似於gradient2D()(至少在片段着色器中)的東西,它是利用簡單的屏幕空間導數還是直接工作使用光柵化器和內插紋理座標來計算精確的漸變?

最後,設備之間的這種行爲有多一致?一篇舊文章(如DirectX 9中的舊文章)我讀到複雜的特定於設備的mipmap選擇,但我不知道mipmap選擇是否在較新的體系結構中更好地定義。

回答

0

這是一個比較大的課題,你可能會更好,詢問關於https://computergraphics.stackexchange.com/但是,很簡單,蘭斯·威廉姆斯紙"Pyramidal Parametrics"介紹了三線性過濾和‘MIP映射’,具有從保羅來了個建議赫克伯特(見第三頁第一欄),我認爲在某些系統中,我認爲這種情況在某種程度上仍然可以使用。

實際上,計算MIP地圖水平的方法通常基於您的屏幕像素是一個小圓圈的假設,並且可以將該圓圈映射回紋理以近似得到一個橢圓。您可以估計最高分辨率貼圖的紋素長軸長度。然後這告訴你你應該採樣哪些MIP地圖。例如,如果長度是6,即介於2^2和2^3之間,則希望在MIP映射級別2和3之間混合。