1. 程式人生 > >蝸牛漫步。。。我要一步一步往上爬。。。

蝸牛漫步。。。我要一步一步往上爬。。。

為了加快渲染速度和減少紋理鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的檔案,這樣的貼圖被稱為Mipmap。

技術分享

使用DirectX Texture Tool(DX自帶工具)預生成Mipmap Chain

技術分享

Original Mip1 Mip2 Mip3 Mip4 Mip5 Mip6 Mip7 Mip8
256x256 128x128 64x64 32x32 16x16 8x8 4x4 2x2 1x1

(1)Mipmap寬高值不一定要相等,但需要為2的n次冪,最低精度為1x1

(2)從原始高精度的Mipmap寬高減半,逐級生成低精度的Mipmap層級;所有低精度層級加起來,會增加1/3儲存空間的佔用       

      ① Mipmap貼圖檔案佔用更多硬碟空間     -- 解決方法:使用dds進行壓縮儲存
      ② Mipmap紋理佔用更多記憶體、視訊記憶體空間

DDS檔案

DDS(DirectDraw Surface):一種使用S3 Texture Compression (S3TC,sometimes also called DXTn or DXTC)演算法來壓縮儲存Mipmap層級的資料格式,

DXTn(DXT1、DXT2、DXT3、DXT4及DXT5)演算法可被GPU硬體解壓縮,這也使得DDS檔案被廣泛用來儲存紋理資料,其中DXT2與DXT4為過渡演算法,用得不多。

當然,DDS也可儲存不具有mipmap級別、及未壓縮的畫素格式的紋理貼圖。

演算法 說明
DXT1 壓縮比為1:8(最高),只有1bit Alpha,Alpha通道資訊幾乎完全喪失。一般將不帶Alpha通道的圖片壓縮成這種格式。
DXT2

壓縮比為1:4 ,使用了4bit Alpha,可以有16個Alpha值,可很好地用於Alpha通道銳利、對比強烈的半透和鏤空材質。

DXT3 壓縮比為1:4 ,使用了線形插值的4bit Alpha,特別適合Alpha通道柔和的材質,如高光掩碼材質。

DirectX Texture Tool工具也可以編輯DDS檔案的DXT壓縮方式;關於DXT的更多資訊可參考:DXT 圖片壓縮  

影象重取樣插值演算法簡介

演算法

說明

最近相鄰插值

(Nearest Neighbour Interpolation)

優點是計算量很小,演算法簡單,運算速度較快。但它僅使用離待測取樣點最近的畫素的顏色值作為該取樣點的顏色值,而沒考慮其他相鄰畫素點的影響,

因而重新取樣後顏色值有明顯的不連續性,影象質量損失較大,會產生明顯的馬賽克和鋸齒現象。

兩次線性插值

(Bilinear Interpolation)

2x2 average

average four pixels

計算量稍大,基本克服了最近相鄰插值演算法顏色值不連續的特點,因為它考慮了待測取樣點周圍四個直接鄰點對該取樣點的相關性影響。

但是,此方法僅考慮待測樣點周圍四個直接鄰點顏色值的影響, 而未考慮到各鄰點間顏色值變化率的影響, 因此具有低通濾波器的性質,

從而導致縮放後圖像的高頻分量受到損失, 影象邊緣在一定程度上變得較為模糊。

兩次立方插值

(Bicubic Interpolation)

8x8 [with sharpening]

4x4 filter [with sharpening]

計算量最大,演算法也最為複雜的。在幾何運算中,兩次線性插值演算法的平滑作用可能會使影象的細節產生退化,在進行放大處理時,這種影響更為明顯。

在其他應用中,兩次線性插值演算法的斜率不連續性會產生不希望的結果。兩次立方插值演算法不僅考慮到周圍四個直接相鄰畫素點顏色值的影響,還考慮到它們顏色值變化率的影響。

因此克服了前兩種方法的不足之處,能夠產生比兩次線性插值更為平滑的邊緣,計算精度很高,處理後的影象像質損失最少,效果是最佳的。

Adobe PhotoShop CS6在影象縮放時,提供了以上三種演算法供使用者選擇:

技術分享

D3D9中使用Mipmap

① 載入Mipmap貼圖檔案到記憶體

<span style="font-family:Verdana;">void* MipData[MAX_TEXTURE_MIP_COUNT];
LoadMipmapFile(“Maya_Basho_A_Leaf_sm_D.dds”, &MipData);</span>

 ② 建立Mipmap紋理,並繫結資料
IDirect3DTexture9 * pMipMap;
// 第3個引數 5 表示從256向下生成5個Mipmap層級(含256);該引數為0表示使用D3D來生成所有層級的Mipmap
m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED, &pMipMap);
for( INT MipIndex=0; MipIndex<5; MipIndex++ )
{
    D3DLOCKED_RECT LockedRect;
    pMipMap->LockRect( MipIndex, &LockedRect, NULL, D3DLOCK_NOSYSLOCK );
    GetTexDataFromMipData( MipData, MipIndex, LockedRect.pBits, LockedRect.Pitch );
    pTexture->UnlockRect( MipIndex ); 
}

③ 設定Mipmap紋理取樣器引數
m_pD3DDevice->SetTexture(SamplerIdx, pMipMap);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_ADDRESSW, D3DTADDRESS_WRAP);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MIPFILTER, D3DTEXF_POINT);
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MIPMAPLODBIAS, 1);// Mipmap層級向高精度偏移1個層級
Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MAXANISOTROPY, 4);// 最大異性取樣閾值設定為4

紋理地址模式

紋理座標uv的範圍為:[0, 1] x [0, 1] 。若頂點u和v大於1或小於0時,則需要用相應的紋理地址模式來定址,以確定該頂點所應採用的紋理畫素顏色值。

常用紋理地址模式有:包裹模式(Wrap)  映象模式(Mirror)  夾子模式(Clamp)

技術分享

紋理對映

定義:使用uv座標將紋理畫素(texel)對映到螢幕畫素(pixel)的過程。 

技術分享


紋理過濾

由於相機不一定正對著物體,以及透視投影為非正交投影,紋理並不會1:1的投影到物體表面並最終呈現到實際的螢幕畫素上。

當最後呈現到螢幕中的尺寸比紋理實際尺寸大的時候,此時需要對紋理進行放大(Texture Magnification),反之需要縮小(Texture Minification)。

紋理放大采樣的時候如果不經處理,則會出現馬賽克等方塊等情況,如果紋理縮小取樣的時候不經處理,那麼就會產生紋理鋸齒。因此,紋理過濾就變得非常必要。

技術分享

從上影象素點被縮放的程度上看,當螢幕畫素(pixel):紋理畫素(texel)為n:1時,則進行紋理放大;為1:n時,則進行紋理縮小。 注:n>1

紋理過濾演算法

技術分享

各向同性:螢幕畫素(pixel)在u、v方向上使用相同精度紋理畫素(texel)

各向異性:螢幕畫素(pixel)在u、v方向上使用不同精度紋理畫素(texel)

MIPFILTER說明

① 為D3DTEXF_NONE,表示不使用MipMap

② 為D3DTEXF_POINT,在一層Mipmap進行紋理取樣

③ 為D3DTEXT_LINEAR,在兩層Mipmap進行紋理取樣,然後在兩層之間做線性融合,因此在不同層級的Mipmap之間有更好地過度

Mipmap層級選擇 -- 各向同性

技術分享

① 計算得到對映比【螢幕畫素(pixel):紋理畫素(texel)】最小P(min)的螢幕畫素點A

② 計算畫素點A的uv在螢幕空間的對應方向,並沿著該方向得到螢幕畫素區域的最小外接平行四邊形MNOP

③ 計算n=Min{m=x*P(min)(u), n=y*P(min)(v)}   注:x、y為平行四邊形MNOP的u、v對應方向上的邊長;m、n為u、v方向的紋理畫素值

④ 通過n<=h && Min{h1, h2, ...}條件,得到MIPFILTER=D3DTEXF_POINT的Mipmap層級L(上圖中為: 64)

⑤ 若MIPFILTER=D3DTEXF_LINEAR,除了選擇層級L外,還要選擇L低一級的Mipmap層級(上圖中為: 32)

Mipmap層級選擇 -- 各向異性

技術分享

① 計算得到對映比【螢幕畫素(pixel):紋理畫素(texel)】最大P(max)的螢幕畫素點A

② 計算畫素點A的uv在螢幕空間的對應方向,並沿著該方向得到螢幕畫素區域的最小外接平行四邊形MNOP

③ 計算m=Max{m=x*P(max)(u), n=y*P(max)(v)}   注:x、y為平行四邊形MNOP的u、v對應方向上的邊長;m、n為u、v方向的紋理畫素值

④ 通過m<=w && Min{w1, w2, ...}條件,得到MIPFILTER=D3DTEXF_POINT的Mipmap層級L(上圖中為: 256)

⑤ 若MIPFILTER=D3DTEXF_LINEAR,除了選擇層級L外,還要選擇L低一級的Mipmap層級(上圖中為: 128)

各向異性紋理取樣(以MIPFILTER=D3DTEXF_POINT為例)

技術分享

① 根據上面“Mipmap層級選擇 -- 各向異性”的規則,得到Mipmap層級L: 256

② 計算任意畫素點K的uv在螢幕空間的對應方向,並沿著該方向得到螢幕畫素區域的最小外接平行四邊形MNOP

③ 分別計算uv方向的紋理畫素值 m=x*P(k)(u), n=y*P(k)(v)   注:x、y為平行四邊形MNOP的u、v對應方向上的邊長

④ 分別計算S(u)=Min{MaxAnisotropy, L/m},S(v)=Min{MaxAnisotropy, L/n}

⑤ 對S(u),S(v)進行四捨五入取整 (上圖中為: S(u)=2 S(v)=4)

⑥ 螢幕畫素K對應紋理畫素點所在的2x4的區域內取樣,併線性插值計算螢幕畫素K的顏色值

最大MaxAnisotropy閾值

(1) 使用DirectX Caps Viewer檢視顯示卡的MaxAnisotropy閾值 

技術分享

(2) 另外要注意控制面板中的顯示卡全域性設定(① 是否由3D應用程式決定  ②若由顯示卡決定,看看MaxAnisotropy設定大小)

不同MaxAnisotropy效果對比

技術分享

MaxAnisotropy設定得越大,遠處的畫面細節保留得越多(上圖中離視點越遠的地方,各向異性程度越高)

常用的紋理過濾引數組合

過濾方式

MinFilter

MagFilter

MipFilter

取樣數

Point(最近點取樣)

D3DTEXF_POINT

D3DTEXF_POINT D3DTEXF_POINT 1

Bilinear(雙線性插值)

D3DTEXF_LINEAR

D3DTEXF_LINEAR D3DTEXF_POINT 4

Trilinear(三線性插值)

D3DTEXF_LINEAR D3DTEXF_LINEAR D3DTEXF_LINEAR 8

AnisotropicPoint(各向異性)

D3DTEXF_ANISOTROPIC

D3DTEXF_LINEAR D3DTEXF_POINT 4 x n

AnisotropicLinear(各向異性)

D3DTEXF_ANISOTROPIC D3DTEXF_LINEAR D3DTEXF_LINEAR 8 x n

技術分享

① 取樣數可以反映出演算法的複雜度:取樣數越大,耗費的計算越多

① Point、Bilinear、Trilinear畫面效果基本差不多;細看的話,Trilinear > Bilinear > Point,Trilinear在Mipmap層級間過渡更自然平滑些

② AnisotropicLinear效果最好,在Mipmap層級間過渡方面要好於AnisotropicPoint,不過基本上看不出來AnisotropicPoint與AnisotropicLinear的差別了

參考



相關推薦

蝸牛漫步

為了加快渲染速度和減少紋理鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的檔案,這樣的貼圖被稱為Mipmap。 使用DirectX Texture Tool(DX自帶工具)預生成Mipmap Chain Original Mip1 Mip2 Mip3

蝸牛揹著那重重的殼呀,.......

很多時候因為要使用GridView或者ListView的時候需要做邊框來區分格子,但是如果上下左右都有邊框的話導致邊框重疊,線會變粗,如果改成只有上下邊框或者只有左右邊框,甚至只有下邊框就會好很多。 1.新建一個*.xml 檔案 以我建立的lis

“媽媽,不想學了”,你的回答改變孩子一生(悵然若失,說了一句話:“為什麼當初沒有人逼?”。我不願意學,你就不讓學啦!那時候還小,還不懂事,難道你也不懂事嗎。要做成件事,就必須有延遲滿足的能力)

“媽媽,我不想學了”,你的回答改變孩子一生(組圖)新聞來源: 槽值 前兩天,送孩子去書法班的時候,在小區門口看到一位媽媽,她正拽著孩子往車裡進,孩子哭著掙扎:“我不想學舞蹈了,我不去,太累了……” 媽媽怒吼著:“你今天去也得去,不去也得給我去!” 最終,孩子還是拗不過媽媽,上了車,去學舞蹈。 我不禁想

1.男子在路邊根接著根地抽煙一個女士走過來對他說:“嘿,你不知道你是在慢性自殺嗎?註意看看煙盒的警告信息”“沒關系”, 男子悠然自得地又吸了口:“是個程序員”“嗯?這和你是程序員有什麽關系?...

我不知道 不知道 對他 上網 是我 .com 一個 但是 err 1.一男子在路邊一根接著一根地抽煙。一個女士走過來對他說:“嘿,你不知道你是在慢性自殺嗎?註意看看煙盒上的警告信息。”“沒關系”,男子悠然自得地又吸了一口:“我是個程序員。”“嗯?這和你是程序員有什麽關系?”

抓狂了又回到了幾天不能A一道題的時候

sdn 做了 csdn ati .net xheditor dsm gif 微笑 poj1556我不做了。你做做把...我已經要game over了 我要抓狂了。。又回到了幾天不能A一道題的時候

TCP 三次握手(相當於寄信需要回執,第一次握手:寄給你封信第二次握手:你回封信第三次握手:再給你一個回執,這樣你才能確認收到信了)

需要 flags 並發 如果 details live 丟失 tail 進行 TCP 連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息。以下步驟概述了通常情況下客戶端計算機聯系服務器計算機的過程: 1. 客戶端向服務器

關於python,完善計算機知識的

希望 -- 也有 信心 領域 view 講課 基本 程序語言 因為身為理科男,所以特別喜歡涉及其他領域的知識。而對我來說,計算機是很有誘惑力的--尤其是程序語言設計,懂得一門“外語”是多麽的重要。大一時候接觸過包括有計算機的基本知識,c語言,這個新的學期也開始接觸labvi

真正掌握vuex的使用方法(二)現在有的小夥伴是不是在想,以後如果在這裏寫自己的計算屬性怎麽辦?怎麽辦?咱們可以通過對象合並的方法去實現 通過Object.assign()合並對象:

als js文件 false 目錄 pan md5加密 擴展 對象 pre 從上篇文章當中相信大家已經對vuex有了一些大概了解了,接下來咱們結合實例來繼續敲代碼吧!切記一定要動手實操練習一遍! 接下來咱們來完成一個超級簡單的投票功能!要求很簡單,點擊“投票”按鈕,相應的票

從公務員到名打工仔:網上玩北京賽車之後,歷經辛酸從頭再來希望大家不要像一樣能早日戒賭!

        本以為成為一名賭狗之後這輩子也就完蛋了!但感學老天爺給我了二次重生的機會,從此立志做人,走出多年的陰影。再也不參與du了!        我本有一個幸福的

某君從某年開始每年都舉辦次生日party,並且每次都吹熄與年齡相同根數的蠟燭

某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來,他一共吹熄了236根蠟燭。 請問,他從多少歲開始過生日party的? 請填寫他開始過生日party的年齡數。 注意:你提交的應該是一個整數,不

很多人在Google Play商店購買或下載APP時出現問題,例如在你新安裝的系統恢復APP或想安裝心願單中的APP時,Play商店出現不能載入等錯誤,這實在是太煩人了 所以,通過搜尋,把可

error 491 問題說明: downloads and updates impossible. (不能下載或更新) 解決方案: 進入您的裝置設定,刪除Google賬戶的所有內容。重啟您的Android裝置並重新新增G

一個使用正則表示式治口吃的問題將“..........學學學...編編編...程”抽取為“學程式設計”

import java.util.TreeSet; public class RegexTest { public static void main(String[] args) { Method1();//1.治口吃 } //1.治口吃 private static voi

耶魯女孩:改變,從背單詞開始!(劉暢:知道耶魯會錄取學習,都經歷死記硬背)

一名濟南中學生與耶魯大學的距離有多遠?山東省實驗中學劉暢用一顆善於思考的心給出了答案。 劉暢是省實驗中學學生會主席、省學聯副主席、高三(15)班班長,2009年暑假,劉暢自行報名參加了聯合國青年大會。就在不久前,這名19歲女生被耶魯大學、斯坦福大學等10所美國高校錄取,耶魯和斯坦福同時為她提

wengyupeng 蝸牛

  ABAP中有三類內表,標準表,排序表和雜湊表。 三種內表介紹    標準表的每一行對應一個邏輯索引-SY-TABIX,填充內表的時候,可以將資料附加在現有行 之後,也可以插入到指定的位置,程式對內錶行的定址操作可通過關鍵字或索引進行。在對錶 進行插入刪除等操作時,各資料行

成大事者不糾結(碰到難辦的事情的時候,就事論事,專註當下,放下過去,不憂未來,也不要記仇防範之舉節制是做事情的其中種策略,而且還要分場合)

什麽 但是 例子 其中 偏方 戰術 學會 自己 態度 成大事者不糾結(碰到難辦的事情的時候,要就事論事,放下過去,不憂未來,也不要記仇。防範之舉要節制。是做事情的其中一種策略,而且還要分場合)跟老中醫不要玩偏方不過也要看情況,只能說,這是處理難辦事情的其中一種方法有時

成大事者不糾結(碰到難辦的事情的時候,就事論事,專注當下,放下過去,不憂未來,也不要記仇防範之舉節制是做事情的其中種策略,而且還要分場合)

  成大事者不糾結(碰到難辦的事情的時候,要就事論事,放下過去,不憂未來,也不要記仇。防範之舉要節制。是做事情的其中一種策略,而且還要分場合)跟老中醫不要玩偏方不過也要看情況,只能說,這是處理難辦事情的其中一種方法有時候想多了沒用,不如著手去做那些簡單易做的事,等做完後發現難的事情也不那麼難了。而

【陸佳鵬勇往直前的程式設計路】積極,努力是的格言進步,變厲害

陸佳鵬,一個比較喜歡部落格和微博的人,平易近人,為人誠懇,性格開朗,積極進取,適應力強、腳踏實地,有較強的團隊精神,工作積極進取,態度認真。有自制力,做事情始終堅持有始有終,就如吃潤生養髮一樣,每天我都堅持吃潤生養髮。還有,對於豐麗果的話,雖然不是我用,但是,我的朋友一直覺得豐麗果不錯。

鮑鵬山:我們培養了很多高學歷的野蠻人 導讀: 德國哲學家尼采寫過篇文章叫《為什麼這麼聰明》他的結論就一句話:之所以這麼聰明,是因為從來不在不必要的事情浪費精力生活中有太多這樣無用

[轉帖]鮑鵬山:我們培養了很多高學歷的野蠻人導讀:德國哲學家尼采寫過一篇文章叫《我為什麼這麼聰明》。他的結論就一句話:我之所以這麼聰明,是因為我從來不在不必要的事情上浪費精力。生活中有太多這樣無用的知識,但是在生活中,確實有不少人專心致志、興高采烈、興趣盎然地用瑣碎的知識,

【黃承輝學習C#和.NET等問題總結】樂於學習新知識,踏實肯幹,願意付出比別人多的努力去掌握項技能,接受新事物能力強

黃承輝,我呢,性格比較內向的,很少交流,但是,程式設計的話,我會上一些部落格學習和分享。我自己,熟悉HTML,CSS,Javascript運用DIV+CSS網頁佈局,熟悉W3C網頁標準,掌握圖片、CSS的優化方法。還有,最近由於一些原因,我比較關注袋鼠媽媽護膚品。我也一直不瞭解袋鼠媽媽護

所經歷的次社會無賴中介的大考驗,僅此記錄,以介(北京朝陽區黑中介楊沫)

時間:2018年4月1日-5月15日地點:北京市朝陽區 康各莊路 金澤家園C區310號樓3單元202室背景:租房住,因入住時為8月底,所以之後在次年4月搬走時沒有用過空調一次,搬走時中介推脫修好空調扣款再退,結果託了1個多月也沒辦成這事,最後翻臉後我找修空調的來修理,修完後每